{
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "computer",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "asset",
          "type": "address"
        }
      ],
      "name": "InvalidComputerContract",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "fee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "limit",
          "type": "uint256"
        }
      ],
      "name": "InvalidFeeValue",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroFeeCollector",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroLoanContract",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "string",
          "name": "newUri",
          "type": "string"
        }
      ],
      "name": "DefaultLOANMetadataUriUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "oldFeeCollector",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "newFeeCollector",
          "type": "address"
        }
      ],
      "name": "FeeCollectorUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "oldFee",
          "type": "uint16"
        },
        {
          "indexed": false,
          "internalType": "uint16",
          "name": "newFee",
          "type": "uint16"
        }
      ],
      "name": "FeeUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "loanContract",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "newUri",
          "type": "string"
        }
      ],
      "name": "LOANMetadataUriUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferStarted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "MAX_FEE",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "acceptOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "fee",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeCollector",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "pool",
          "type": "address"
        }
      ],
      "name": "getPoolAdapter",
      "outputs": [
        {
          "internalType": "contract IPoolAdapter",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "asset",
          "type": "address"
        }
      ],
      "name": "getStateFingerprintComputer",
      "outputs": [
        {
          "internalType": "contract IStateFingerpringComputer",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        },
        {
          "internalType": "uint16",
          "name": "_fee",
          "type": "uint16"
        },
        {
          "internalType": "address",
          "name": "_feeCollector",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "loanContract",
          "type": "address"
        }
      ],
      "name": "loanMetadataUri",
      "outputs": [
        {
          "internalType": "string",
          "name": "uri",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pendingOwner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "pool",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "adapter",
          "type": "address"
        }
      ],
      "name": "registerPoolAdapter",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "asset",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "computer",
          "type": "address"
        }
      ],
      "name": "registerStateFingerprintComputer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "metadataUri",
          "type": "string"
        }
      ],
      "name": "setDefaultLOANMetadataUri",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint16",
          "name": "_fee",
          "type": "uint16"
        }
      ],
      "name": "setFee",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_feeCollector",
          "type": "address"
        }
      ],
      "name": "setFeeCollector",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "loanContract",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "metadataUri",
          "type": "string"
        }
      ],
      "name": "setLOANMetadataUri",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": {
    "object": "0x608060405234801561001057600080fd5b5061001a33610031565b610022610058565b61002c6000610031565b610174565b600180546001600160a01b031916905561005581610124602090811b61095917901c565b50565b600154600160a81b900460ff16156100c65760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b600154600160a01b900460ff90811614610122576001805460ff60a01b191660ff60a01b17905560405160ff81527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610f31806101836000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063a42dce80116100a2578063c4743ae011610071578063c4743ae014610265578063cbf35d8814610278578063ddca3f431461028b578063e30c3978146102a0578063f2fde38b146102b157600080fd5b8063a42dce80146101f7578063b20912311461020a578063bc063e1a14610236578063c415b95c1461025257600080fd5b8063715018a6116100e9578063715018a6146101b057806379ba5097146101b85780638da5cb5b146101c05780638e005553146101d1578063935bf0d7146101e457600080fd5b8063233557501461011b5780632df927ac146101445780634bbcf8de14610188578063708c0db91461019d575b600080fd5b61012e610129366004610b4f565b6102c4565b60405161013b9190610b71565b60405180910390f35b610170610152366004610b4f565b6001600160a01b039081166000908152600460205260409020541690565b6040516001600160a01b03909116815260200161013b565b61019b610196366004610c62565b61042f565b005b61019b6101ab366004610cc2565b6104c6565b61019b6106ad565b61019b6106c1565b6000546001600160a01b0316610170565b61019b6101df366004610d05565b61073b565b61019b6101f2366004610d20565b61074c565b61019b610205366004610b4f565b61082a565b610170610218366004610b4f565b6001600160a01b039081166000908152600560205260409020541690565b61023f6103e881565b60405161ffff909116815260200161013b565b600254610170906001600160a01b031681565b61019b610273366004610d53565b61083b565b61019b610286366004610d20565b6108b2565b60015461023f90600160b01b900461ffff1681565b6001546001600160a01b0316610170565b61019b6102bf366004610b4f565b6108e8565b6001600160a01b03811660009081526003602052604090208054606091906102eb90610d90565b80601f016020809104026020016040519081016040528092919081815260200182805461031790610d90565b80156103645780601f1061033957610100808354040283529160200191610364565b820191906000526020600020905b81548152906001019060200180831161034757829003601f168201915b50505050509050805160000361042a576000805260036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff80546103a990610d90565b80601f01602080910402602001604051908101604052809291908181526020018280546103d590610d90565b80156104225780601f106103f757610100808354040283529160200191610422565b820191906000526020600020905b81548152906001019060200180831161040557829003601f168201915b505050505090505b919050565b6104376109a9565b6001600160a01b03821661045e5760405163a9fcf0f560e01b815260040160405180910390fd5b6001600160a01b03821660009081526003602052604090206104808282610e19565b50816001600160a01b03167f6004b71123e07b97df793497325c4438343da4eeb06cfe39475aa69d93476527826040516104ba9190610b71565b60405180910390a25050565b600154600160a81b900460ff16158080156104ec575060018054600160a01b900460ff16105b8061050c5750303b15801561050c575060018054600160a01b900460ff16145b6105745760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6001805460ff60a01b1916600160a01b17905580156105a1576001805460ff60a81b1916600160a81b1790555b6001600160a01b0384166105ef5760405162461bcd60e51b81526020600482015260156024820152744f776e6572206973207a65726f206164647265737360581b604482015260640161056b565b6105f884610a03565b6001600160a01b03821661064e5760405162461bcd60e51b815260206004820152601d60248201527f46656520636f6c6c6563746f72206973207a65726f2061646472657373000000604482015260640161056b565b61065782610a1c565b61066083610aa5565b80156106a7576001805460ff60a81b191681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6106b56109a9565b6106bf6000610a03565b565b60015433906001600160a01b0316811461072f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161056b565b61073881610a03565b50565b6107436109a9565b61073881610aa5565b6107546109a9565b6001600160a01b038116156107fc576040516261f76560e41b81526001600160a01b03838116600483015282169063061f765090602401602060405180830381865afa1580156107a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc9190610ed9565b6107fc5760405163e12aeae760e01b81526001600160a01b0380831660048301528316602482015260440161056b565b6001600160a01b03918216600090815260046020526040902080546001600160a01b03191691909216179055565b6108326109a9565b61073881610a1c565b6108436109a9565b6000805260036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff6108778282610e19565b507fe358eb330ebc40c9c9375742912f9c5a8ae1db2e9990a15039c889ba971e128b816040516108a79190610b71565b60405180910390a150565b6108ba6109a9565b6001600160a01b03918216600090815260056020526040902080546001600160a01b03191691909216179055565b6108f06109a9565b600180546001600160a01b0383166001600160a01b031990911681179091556109216000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146106bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161056b565b600180546001600160a01b031916905561073881610959565b6001600160a01b038116610a4357604051635fb3e86760e11b815260040160405180910390fd5b600280546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f5d16ad41baeb009cd23eb8f6c7cde5c2e0cd5acf4a33926ab488875c37c37f3891015b60405180910390a15050565b6103e861ffff82161115610ada5760405163f6696bd560e01b815261ffff821660048201526103e8602482015260440161056b565b6001805461ffff838116600160b01b81810261ffff60b01b1985161790945560408051949093049091168084526020840191909152917f2e7c4279000925b8ff0bca0e7109cbc47fc6f6c4edfb831ffe7466cf0af07fa09101610a99565b80356001600160a01b038116811461042a57600080fd5b600060208284031215610b6157600080fd5b610b6a82610b38565b9392505050565b600060208083528351808285015260005b81811015610b9e57858101830151858201604001528201610b82565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610be657600080fd5b813567ffffffffffffffff80821115610c0157610c01610bbf565b604051601f8301601f19908116603f01168101908282118183101715610c2957610c29610bbf565b81604052838152866020858801011115610c4257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215610c7557600080fd5b610c7e83610b38565b9150602083013567ffffffffffffffff811115610c9a57600080fd5b610ca685828601610bd5565b9150509250929050565b803561ffff8116811461042a57600080fd5b600080600060608486031215610cd757600080fd5b610ce084610b38565b9250610cee60208501610cb0565b9150610cfc60408501610b38565b90509250925092565b600060208284031215610d1757600080fd5b610b6a82610cb0565b60008060408385031215610d3357600080fd5b610d3c83610b38565b9150610d4a60208401610b38565b90509250929050565b600060208284031215610d6557600080fd5b813567ffffffffffffffff811115610d7c57600080fd5b610d8884828501610bd5565b949350505050565b600181811c90821680610da457607f821691505b602082108103610dc457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610e1457600081815260208120601f850160051c81016020861015610df15750805b601f850160051c820191505b81811015610e1057828155600101610dfd565b5050505b505050565b815167ffffffffffffffff811115610e3357610e33610bbf565b610e4781610e418454610d90565b84610dca565b602080601f831160018114610e7c5760008415610e645750858301515b600019600386901b1c1916600185901b178555610e10565b600085815260208120601f198616915b82811015610eab57888601518255948401946001909101908401610e8c565b5085821015610ec95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215610eeb57600080fd5b81518015158114610b6a57600080fdfea26469706673582212204003e6b013d4aac90c6538b0ca83f7edea11b482d0dc530140893659c31b9d6a64736f6c63430008100033",
    "sourceMap": "539:8934:73:-:0;;;3609:194;;;;;;;;;-1:-1:-1;936:32:27;734:10:56;936:18:27;:32::i;:::-;3734:22:73::1;:20;:22::i;:::-;3766:30;3793:1;3766:18;:30::i;:::-;539:8934:::0;;1501:153:28;1590:13;1583:20;;-1:-1:-1;;;;;;1583:20:28;;;1613:34;1638:8;1613:24;;;;;;;:34;;:::i;:::-;1501:153;:::o;5917:280:41:-;5985:13;;-1:-1:-1;;;5985:13:41;;;;5984:14;5976:66;;;;-1:-1:-1;;;5976:66:41;;216:2:119;5976:66:41;;;198:21:119;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:119;;;338:37;392:19;;5976:66:41;;;;;;;;6056:12;;-1:-1:-1;;;6056:12:41;;6072:15;6056:12;;;:31;6052:139;;6103:12;:30;;-1:-1:-1;;;;6103:30:41;-1:-1:-1;;;6103:30:41;;;6152:28;;6118:15;564:36:119;;6152:28:41;;552:2:119;537:18;6152:28:41;;;;;;;6052:139;5917:280::o;2426:187:27:-;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:27;;;-1:-1:-1;;;;;;2534:17:27;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;422:184:119:-;539:8934:73;;;;;;",
    "linkReferences": {}
  },
  "deployedBytecode": {
    "object": "0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063a42dce80116100a2578063c4743ae011610071578063c4743ae014610265578063cbf35d8814610278578063ddca3f431461028b578063e30c3978146102a0578063f2fde38b146102b157600080fd5b8063a42dce80146101f7578063b20912311461020a578063bc063e1a14610236578063c415b95c1461025257600080fd5b8063715018a6116100e9578063715018a6146101b057806379ba5097146101b85780638da5cb5b146101c05780638e005553146101d1578063935bf0d7146101e457600080fd5b8063233557501461011b5780632df927ac146101445780634bbcf8de14610188578063708c0db91461019d575b600080fd5b61012e610129366004610b4f565b6102c4565b60405161013b9190610b71565b60405180910390f35b610170610152366004610b4f565b6001600160a01b039081166000908152600460205260409020541690565b6040516001600160a01b03909116815260200161013b565b61019b610196366004610c62565b61042f565b005b61019b6101ab366004610cc2565b6104c6565b61019b6106ad565b61019b6106c1565b6000546001600160a01b0316610170565b61019b6101df366004610d05565b61073b565b61019b6101f2366004610d20565b61074c565b61019b610205366004610b4f565b61082a565b610170610218366004610b4f565b6001600160a01b039081166000908152600560205260409020541690565b61023f6103e881565b60405161ffff909116815260200161013b565b600254610170906001600160a01b031681565b61019b610273366004610d53565b61083b565b61019b610286366004610d20565b6108b2565b60015461023f90600160b01b900461ffff1681565b6001546001600160a01b0316610170565b61019b6102bf366004610b4f565b6108e8565b6001600160a01b03811660009081526003602052604090208054606091906102eb90610d90565b80601f016020809104026020016040519081016040528092919081815260200182805461031790610d90565b80156103645780601f1061033957610100808354040283529160200191610364565b820191906000526020600020905b81548152906001019060200180831161034757829003601f168201915b50505050509050805160000361042a576000805260036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff80546103a990610d90565b80601f01602080910402602001604051908101604052809291908181526020018280546103d590610d90565b80156104225780601f106103f757610100808354040283529160200191610422565b820191906000526020600020905b81548152906001019060200180831161040557829003601f168201915b505050505090505b919050565b6104376109a9565b6001600160a01b03821661045e5760405163a9fcf0f560e01b815260040160405180910390fd5b6001600160a01b03821660009081526003602052604090206104808282610e19565b50816001600160a01b03167f6004b71123e07b97df793497325c4438343da4eeb06cfe39475aa69d93476527826040516104ba9190610b71565b60405180910390a25050565b600154600160a81b900460ff16158080156104ec575060018054600160a01b900460ff16105b8061050c5750303b15801561050c575060018054600160a01b900460ff16145b6105745760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6001805460ff60a01b1916600160a01b17905580156105a1576001805460ff60a81b1916600160a81b1790555b6001600160a01b0384166105ef5760405162461bcd60e51b81526020600482015260156024820152744f776e6572206973207a65726f206164647265737360581b604482015260640161056b565b6105f884610a03565b6001600160a01b03821661064e5760405162461bcd60e51b815260206004820152601d60248201527f46656520636f6c6c6563746f72206973207a65726f2061646472657373000000604482015260640161056b565b61065782610a1c565b61066083610aa5565b80156106a7576001805460ff60a81b191681556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6106b56109a9565b6106bf6000610a03565b565b60015433906001600160a01b0316811461072f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161056b565b61073881610a03565b50565b6107436109a9565b61073881610aa5565b6107546109a9565b6001600160a01b038116156107fc576040516261f76560e41b81526001600160a01b03838116600483015282169063061f765090602401602060405180830381865afa1580156107a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc9190610ed9565b6107fc5760405163e12aeae760e01b81526001600160a01b0380831660048301528316602482015260440161056b565b6001600160a01b03918216600090815260046020526040902080546001600160a01b03191691909216179055565b6108326109a9565b61073881610a1c565b6108436109a9565b6000805260036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff6108778282610e19565b507fe358eb330ebc40c9c9375742912f9c5a8ae1db2e9990a15039c889ba971e128b816040516108a79190610b71565b60405180910390a150565b6108ba6109a9565b6001600160a01b03918216600090815260056020526040902080546001600160a01b03191691909216179055565b6108f06109a9565b600180546001600160a01b0383166001600160a01b031990911681179091556109216000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146106bf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161056b565b600180546001600160a01b031916905561073881610959565b6001600160a01b038116610a4357604051635fb3e86760e11b815260040160405180910390fd5b600280546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f5d16ad41baeb009cd23eb8f6c7cde5c2e0cd5acf4a33926ab488875c37c37f3891015b60405180910390a15050565b6103e861ffff82161115610ada5760405163f6696bd560e01b815261ffff821660048201526103e8602482015260440161056b565b6001805461ffff838116600160b01b81810261ffff60b01b1985161790945560408051949093049091168084526020840191909152917f2e7c4279000925b8ff0bca0e7109cbc47fc6f6c4edfb831ffe7466cf0af07fa09101610a99565b80356001600160a01b038116811461042a57600080fd5b600060208284031215610b6157600080fd5b610b6a82610b38565b9392505050565b600060208083528351808285015260005b81811015610b9e57858101830151858201604001528201610b82565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112610be657600080fd5b813567ffffffffffffffff80821115610c0157610c01610bbf565b604051601f8301601f19908116603f01168101908282118183101715610c2957610c29610bbf565b81604052838152866020858801011115610c4257600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215610c7557600080fd5b610c7e83610b38565b9150602083013567ffffffffffffffff811115610c9a57600080fd5b610ca685828601610bd5565b9150509250929050565b803561ffff8116811461042a57600080fd5b600080600060608486031215610cd757600080fd5b610ce084610b38565b9250610cee60208501610cb0565b9150610cfc60408501610b38565b90509250925092565b600060208284031215610d1757600080fd5b610b6a82610cb0565b60008060408385031215610d3357600080fd5b610d3c83610b38565b9150610d4a60208401610b38565b90509250929050565b600060208284031215610d6557600080fd5b813567ffffffffffffffff811115610d7c57600080fd5b610d8884828501610bd5565b949350505050565b600181811c90821680610da457607f821691505b602082108103610dc457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610e1457600081815260208120601f850160051c81016020861015610df15750805b601f850160051c820191505b81811015610e1057828155600101610dfd565b5050505b505050565b815167ffffffffffffffff811115610e3357610e33610bbf565b610e4781610e418454610d90565b84610dca565b602080601f831160018114610e7c5760008415610e645750858301515b600019600386901b1c1916600185901b178555610e10565b600085815260208120601f198616915b82811015610eab57888601518255948401946001909101908401610e8c565b5085821015610ec95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215610eeb57600080fd5b81518015158114610b6a57600080fdfea26469706673582212204003e6b013d4aac90c6538b0ca83f7edea11b482d0dc530140893659c31b9d6a64736f6c63430008100033",
    "sourceMap": "539:8934:73:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7103:312;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7829:179;;;;;;:::i;:::-;-1:-1:-1;;;;;7974:26:73;;;7904:25;7974:26;;;:19;:26;;;;;;;;7829:179;;;;-1:-1:-1;;;;;1135:32:119;;;1117:51;;1105:2;1090:18;7829:179:73;936:238:119;6106:423:73;;;;;;:::i;:::-;;:::i;:::-;;3809:345;;;;;;:::i;:::-;;:::i;1824:101:27:-;;;:::i;1734:212:28:-;;;:::i;1201:85:27:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:27;1201:85;;4496:78:73;;;;;;:::i;:::-;;:::i;8262:346::-;;;;;;:::i;:::-;;:::i;5096:115::-;;;;;;:::i;:::-;;:::i;9002:139::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9107:26:73;;;9063:12;9107:26;;;:20;:26;;;;;;;;9002:139;845:37;;878:4;845:37;;;;;4003:6:119;3991:19;;;3973:38;;3961:2;3946:18;845:37:73;3829:188:119;1091:27:73;;;;;-1:-1:-1;;;;;1091:27:73;;;6677:197;;;;;;:::i;:::-;;:::i;9338:132::-;;;;;;:::i;:::-;;:::i;999:17::-;;;;;-1:-1:-1;;;999:17:73;;;;;;847:99:28;926:13;;-1:-1:-1;;;;;926:13:28;847:99;;1139:178;;;;;;:::i;:::-;;:::i;7103:312:73:-;-1:-1:-1;;;;;7208:30:73;;;;;;:16;:30;;;;;7202:36;;7173:17;;7208:30;7202:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7344:3;7338:17;7359:1;7338:22;7334:74;;7380:28;;;:16;:28;;;7374:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7334:74;7103:312;;;:::o;6106:423::-;1094:13:27;:11;:13::i;:::-;-1:-1:-1;;;;;6216:26:73;::::1;6212:191;;6385:18;;-1:-1:-1::0;;;6385:18:73::1;;;;;;;;;;;6212:191;-1:-1:-1::0;;;;;6414:30:73;::::1;;::::0;;;:16:::1;:30;::::0;;;;:44:::1;6447:11:::0;6414:30;:44:::1;:::i;:::-;;6496:12;-1:-1:-1::0;;;;;6473:49:73::1;;6510:11;6473:49;;;;;;:::i;:::-;;;;;;;;6106:423:::0;;:::o;3809:345::-;3291:13:41;;-1:-1:-1;;;3291:13:41;;;;3290:14;;3336:34;;;;-1:-1:-1;3369:1:41;3354:12;;-1:-1:-1;;;3354:12:41;;;;:16;3336:34;3335:97;;;-1:-1:-1;3404:4:41;1702:19:55;:23;;;3376:55:41;;-1:-1:-1;3414:12:41;;;-1:-1:-1;;;3414:12:41;;;;:17;3376:55;3314:190;;;;-1:-1:-1;;;3314:190:41;;7140:2:119;3314:190:41;;;7122:21:119;7179:2;7159:18;;;7152:30;7218:34;7198:18;;;7191:62;-1:-1:-1;;;7269:18:119;;;7262:44;7323:19;;3314:190:41;;;;;;;;;3529:1;3514:16;;-1:-1:-1;;;;3514:16:41;-1:-1:-1;;;3514:16:41;;;3540:65;;;;3590:4;3574:20;;-1:-1:-1;;;;3574:20:41;-1:-1:-1;;;3574:20:41;;;3540:65;-1:-1:-1;;;;;3920:20:73;::::1;3912:54;;;::::0;-1:-1:-1;;;3912:54:73;;7555:2:119;3912:54:73::1;::::0;::::1;7537:21:119::0;7594:2;7574:18;;;7567:30;-1:-1:-1;;;7613:18:119;;;7606:51;7674:18;;3912:54:73::1;7353:345:119::0;3912:54:73::1;3976:26;3995:6;3976:18;:26::i;:::-;-1:-1:-1::0;;;;;4021:27:73;::::1;4013:69;;;::::0;-1:-1:-1;;;4013:69:73;;7905:2:119;4013:69:73::1;::::0;::::1;7887:21:119::0;7944:2;7924:18;;;7917:30;7983:31;7963:18;;;7956:59;8032:18;;4013:69:73::1;7703:353:119::0;4013:69:73::1;4092:31;4109:13;4092:16;:31::i;:::-;4134:13;4142:4;4134:7;:13::i;:::-;3629:14:41::0;3625:99;;;3659:13;:21;;-1:-1:-1;;;;3659:21:41;;;3699:14;;8213:36:119;;;3699:14:41;;8201:2:119;8186:18;3699:14:41;;;;;;;3625:99;3258:472;3809:345:73;;;:::o;1824:101:27:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;1734:212:28:-;926:13;;734:10:56;;-1:-1:-1;;;;;926:13:28;1833:24;;1825:78;;;;-1:-1:-1;;;1825:78:28;;8462:2:119;1825:78:28;;;8444:21:119;8501:2;8481:18;;;8474:30;8540:34;8520:18;;;8513:62;-1:-1:-1;;;8591:18:119;;;8584:39;8640:19;;1825:78:28;8260:405:119;1825:78:28;1913:26;1932:6;1913:18;:26::i;:::-;1776:170;1734:212::o;4496:78:73:-;1094:13:27;:11;:13::i;:::-;4554::73::1;4562:4;4554:7;:13::i;8262:346::-:0;1094:13:27;:11;:13::i;:::-;-1:-1:-1;;;;;8370:22:73;::::1;::::0;8366:187:::1;;8411:56;::::0;-1:-1:-1;;;8411:56:73;;-1:-1:-1;;;;;1135:32:119;;;8411:56:73::1;::::0;::::1;1117:51:119::0;8411:49:73;::::1;::::0;::::1;::::0;1090:18:119;;8411:56:73::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8406:147;;8492:61;::::0;-1:-1:-1;;;8492:61:73;;-1:-1:-1;;;;;9182:15:119;;;8492:61:73::1;::::0;::::1;9164:34:119::0;9234:15;;9214:18;;;9207:43;9099:18;;8492:61:73::1;8952:304:119::0;8406:147:73::1;-1:-1:-1::0;;;;;8564:26:73;;::::1;;::::0;;;:19:::1;:26;::::0;;;;:37;;-1:-1:-1;;;;;;8564:37:73::1;::::0;;;::::1;;::::0;;8262:346::o;5096:115::-;1094:13:27;:11;:13::i;:::-;5173:31:73::1;5190:13;5173:16;:31::i;6677:197::-:0;1094:13:27;:11;:13::i;:::-;6768:28:73::1;::::0;;:16:::1;:28;::::0;;:42:::1;6799:11:::0;6768:28;:42:::1;:::i;:::-;;6825;6855:11;6825:42;;;;;;:::i;:::-;;;;;;;;6677:197:::0;:::o;9338:132::-;1094:13:27;:11;:13::i;:::-;-1:-1:-1;;;;;9427:26:73;;::::1;;::::0;;;:20:::1;:26;::::0;;;;:36;;-1:-1:-1;;;;;;9427:36:73::1;::::0;;;::::1;;::::0;;9338:132::o;1139:178:28:-;1094:13:27;:11;:13::i;:::-;1228::28::1;:24:::0;;-1:-1:-1;;;;;1228:24:28;::::1;-1:-1:-1::0;;;;;;1228:24:28;;::::1;::::0;::::1;::::0;;;1292:7:::1;1247::27::0;1273:6;-1:-1:-1;;;;;1273:6:27;;1201:85;1292:7:28::1;-1:-1:-1::0;;;;;1267:43:28::1;;;;;;;;;;;1139:178:::0;:::o;2426:187:27:-;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:27;;;-1:-1:-1;;;;;;2534:17:27;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:27;734:10:56;1422:23:27;1414:68;;;;-1:-1:-1;;;1414:68:27;;9463:2:119;1414:68:27;;;9445:21:119;;;9482:18;;;9475:30;9541:34;9521:18;;;9514:62;9593:18;;1414:68:27;9261:356:119;1501:153:28;1590:13;1583:20;;-1:-1:-1;;;;;;1583:20:28;;;1613:34;1638:8;1613:24;:34::i;5365:297:73:-;-1:-1:-1;;;;;5436:27:73;;5432:70;;5484:18;;-1:-1:-1;;;5484:18:73;;;;;;;;;;;5432:70;5539:12;;;-1:-1:-1;;;;;5561:28:73;;;-1:-1:-1;;;;;;5561:28:73;;;;;;;5604:51;;;5539:12;;;;9164:34:119;;;9229:2;9214:18;;9207:43;;;;5604:51:73;;9099:18:119;5604:51:73;;;;;;;;5422:240;5365:297;:::o;4744:229::-;878:4;4796:14;;;;4792:85;;;4831:46;;-1:-1:-1;;;4831:46:73;;9804:6:119;9837:15;;4831:46:73;;;9819:34:119;878:4:73;9869:18:119;;;9862:43;9767:18;;4831:46:73;9622:289:119;4792:85:73;4904:3;;;;4917:10;;;-1:-1:-1;;;4917:10:73;;;-1:-1:-1;;;;4917:10:73;;;;;;4942:24;;;4904:3;;;;;;;9819:34:119;;;9884:2;9869:18;;9862:43;;;;4904:3:73;4942:24;;9767:18:119;4942:24:73;9622:289:119;14:173;82:20;;-1:-1:-1;;;;;131:31:119;;121:42;;111:70;;177:1;174;167:12;192:186;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:119:o;383:548::-;495:4;524:2;553;542:9;535:21;585:6;579:13;628:6;623:2;612:9;608:18;601:34;653:1;663:140;677:6;674:1;671:13;663:140;;;772:14;;;768:23;;762:30;738:17;;;757:2;734:26;727:66;692:10;;663:140;;;667:3;852:1;847:2;838:6;827:9;823:22;819:31;812:42;922:2;915;911:7;906:2;898:6;894:15;890:29;879:9;875:45;871:54;863:62;;;;383:548;;;;:::o;1179:127::-;1240:10;1235:3;1231:20;1228:1;1221:31;1271:4;1268:1;1261:15;1295:4;1292:1;1285:15;1311:719;1354:5;1407:3;1400:4;1392:6;1388:17;1384:27;1374:55;;1425:1;1422;1415:12;1374:55;1461:6;1448:20;1487:18;1524:2;1520;1517:10;1514:36;;;1530:18;;:::i;:::-;1605:2;1599:9;1573:2;1659:13;;-1:-1:-1;;1655:22:119;;;1679:2;1651:31;1647:40;1635:53;;;1703:18;;;1723:22;;;1700:46;1697:72;;;1749:18;;:::i;:::-;1789:10;1785:2;1778:22;1824:2;1816:6;1809:18;1870:3;1863:4;1858:2;1850:6;1846:15;1842:26;1839:35;1836:55;;;1887:1;1884;1877:12;1836:55;1951:2;1944:4;1936:6;1932:17;1925:4;1917:6;1913:17;1900:54;1998:1;1991:4;1986:2;1978:6;1974:15;1970:26;1963:37;2018:6;2009:15;;;;;;1311:719;;;;:::o;2035:396::-;2113:6;2121;2174:2;2162:9;2153:7;2149:23;2145:32;2142:52;;;2190:1;2187;2180:12;2142:52;2213:29;2232:9;2213:29;:::i;:::-;2203:39;;2293:2;2282:9;2278:18;2265:32;2320:18;2312:6;2309:30;2306:50;;;2352:1;2349;2342:12;2306:50;2375;2417:7;2408:6;2397:9;2393:22;2375:50;:::i;:::-;2365:60;;;2035:396;;;;;:::o;2436:159::-;2503:20;;2563:6;2552:18;;2542:29;;2532:57;;2585:1;2582;2575:12;2600:332;2676:6;2684;2692;2745:2;2733:9;2724:7;2720:23;2716:32;2713:52;;;2761:1;2758;2751:12;2713:52;2784:29;2803:9;2784:29;:::i;:::-;2774:39;;2832:37;2865:2;2854:9;2850:18;2832:37;:::i;:::-;2822:47;;2888:38;2922:2;2911:9;2907:18;2888:38;:::i;:::-;2878:48;;2600:332;;;;;:::o;3145:184::-;3203:6;3256:2;3244:9;3235:7;3231:23;3227:32;3224:52;;;3272:1;3269;3262:12;3224:52;3295:28;3313:9;3295:28;:::i;3334:260::-;3402:6;3410;3463:2;3451:9;3442:7;3438:23;3434:32;3431:52;;;3479:1;3476;3469:12;3431:52;3502:29;3521:9;3502:29;:::i;:::-;3492:39;;3550:38;3584:2;3573:9;3569:18;3550:38;:::i;:::-;3540:48;;3334:260;;;;;:::o;4022:322::-;4091:6;4144:2;4132:9;4123:7;4119:23;4115:32;4112:52;;;4160:1;4157;4150:12;4112:52;4200:9;4187:23;4233:18;4225:6;4222:30;4219:50;;;4265:1;4262;4255:12;4219:50;4288;4330:7;4321:6;4310:9;4306:22;4288:50;:::i;:::-;4278:60;4022:322;-1:-1:-1;;;;4022:322:119:o;4349:380::-;4428:1;4424:12;;;;4471;;;4492:61;;4546:4;4538:6;4534:17;4524:27;;4492:61;4599:2;4591:6;4588:14;4568:18;4565:38;4562:161;;4645:10;4640:3;4636:20;4633:1;4626:31;4680:4;4677:1;4670:15;4708:4;4705:1;4698:15;4562:161;;4349:380;;;:::o;4860:545::-;4962:2;4957:3;4954:11;4951:448;;;4998:1;5023:5;5019:2;5012:17;5068:4;5064:2;5054:19;5138:2;5126:10;5122:19;5119:1;5115:27;5109:4;5105:38;5174:4;5162:10;5159:20;5156:47;;;-1:-1:-1;5197:4:119;5156:47;5252:2;5247:3;5243:12;5240:1;5236:20;5230:4;5226:31;5216:41;;5307:82;5325:2;5318:5;5315:13;5307:82;;;5370:17;;;5351:1;5340:13;5307:82;;;5311:3;;;4951:448;4860:545;;;:::o;5581:1352::-;5707:3;5701:10;5734:18;5726:6;5723:30;5720:56;;;5756:18;;:::i;:::-;5785:97;5875:6;5835:38;5867:4;5861:11;5835:38;:::i;:::-;5829:4;5785:97;:::i;:::-;5937:4;;6001:2;5990:14;;6018:1;6013:663;;;;6720:1;6737:6;6734:89;;;-1:-1:-1;6789:19:119;;;6783:26;6734:89;-1:-1:-1;;5538:1:119;5534:11;;;5530:24;5526:29;5516:40;5562:1;5558:11;;;5513:57;6836:81;;5983:944;;6013:663;4807:1;4800:14;;;4844:4;4831:18;;-1:-1:-1;;6049:20:119;;;6167:236;6181:7;6178:1;6175:14;6167:236;;;6270:19;;;6264:26;6249:42;;6362:27;;;;6330:1;6318:14;;;;6197:19;;6167:236;;;6171:3;6431:6;6422:7;6419:19;6416:201;;;6492:19;;;6486:26;-1:-1:-1;;6575:1:119;6571:14;;;6587:3;6567:24;6563:37;6559:42;6544:58;6529:74;;6416:201;-1:-1:-1;;;;;6663:1:119;6647:14;;;6643:22;6630:36;;-1:-1:-1;5581:1352:119:o;8670:277::-;8737:6;8790:2;8778:9;8769:7;8765:23;8761:32;8758:52;;;8806:1;8803;8796:12;8758:52;8838:9;8832:16;8891:5;8884:13;8877:21;8870:5;8867:32;8857:60;;8913:1;8910;8903:12",
    "linkReferences": {}
  },
  "methodIdentifiers": {
    "MAX_FEE()": "bc063e1a",
    "acceptOwnership()": "79ba5097",
    "fee()": "ddca3f43",
    "feeCollector()": "c415b95c",
    "getPoolAdapter(address)": "b2091231",
    "getStateFingerprintComputer(address)": "2df927ac",
    "initialize(address,uint16,address)": "708c0db9",
    "loanMetadataUri(address)": "23355750",
    "owner()": "8da5cb5b",
    "pendingOwner()": "e30c3978",
    "registerPoolAdapter(address,address)": "cbf35d88",
    "registerStateFingerprintComputer(address,address)": "935bf0d7",
    "renounceOwnership()": "715018a6",
    "setDefaultLOANMetadataUri(string)": "c4743ae0",
    "setFee(uint16)": "8e005553",
    "setFeeCollector(address)": "a42dce80",
    "setLOANMetadataUri(address,string)": "4bbcf8de",
    "transferOwnership(address)": "f2fde38b"
  },
  "rawMetadata": "{\"compiler\":{\"version\":\"0.8.16+commit.07a7930e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"computer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"InvalidComputerContract\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"InvalidFeeValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroFeeCollector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroLoanContract\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"newUri\",\"type\":\"string\"}],\"name\":\"DefaultLOANMetadataUriUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeCollector\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeCollector\",\"type\":\"address\"}],\"name\":\"FeeCollectorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"oldFee\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"newFee\",\"type\":\"uint16\"}],\"name\":\"FeeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"loanContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"newUri\",\"type\":\"string\"}],\"name\":\"LOANMetadataUriUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_FEE\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fee\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeCollector\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"getPoolAdapter\",\"outputs\":[{\"internalType\":\"contract IPoolAdapter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"getStateFingerprintComputer\",\"outputs\":[{\"internalType\":\"contract IStateFingerpringComputer\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"_fee\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"_feeCollector\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"loanContract\",\"type\":\"address\"}],\"name\":\"loanMetadataUri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"uri\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"adapter\",\"type\":\"address\"}],\"name\":\"registerPoolAdapter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"computer\",\"type\":\"address\"}],\"name\":\"registerStateFingerprintComputer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"metadataUri\",\"type\":\"string\"}],\"name\":\"setDefaultLOANMetadataUri\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_fee\",\"type\":\"uint16\"}],\"name\":\"setFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeCollector\",\"type\":\"address\"}],\"name\":\"setFeeCollector\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"loanContract\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"metadataUri\",\"type\":\"string\"}],\"name\":\"setLOANMetadataUri\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Is intendet to be used as a proxy via `TransparentUpgradeableProxy`.\",\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"getPoolAdapter(address)\":{\"params\":{\"pool\":\"The pool for which the adapter is requested.\"},\"returns\":{\"_0\":\"The adapter for the given pool.\"}},\"getStateFingerprintComputer(address)\":{\"params\":{\"asset\":\"The asset for which the computer is requested.\"},\"returns\":{\"_0\":\"The computer for the given asset.\"}},\"loanMetadataUri(address)\":{\"params\":{\"loanContract\":\"Address of a loan contract.\"},\"returns\":{\"uri\":\"Metadata uri for given loan contract.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"registerPoolAdapter(address,address)\":{\"params\":{\"adapter\":\"The adapter to be registered.\",\"pool\":\"The pool for which the adapter is registered.\"}},\"registerStateFingerprintComputer(address,address)\":{\"params\":{\"asset\":\"The asset for which the computer is registered.\",\"computer\":\"The computer to be registered. Use address(0) to remove a computer.\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setDefaultLOANMetadataUri(string)\":{\"params\":{\"metadataUri\":\"New value of default LOAN token metadata uri.\"}},\"setFee(uint16)\":{\"params\":{\"_fee\":\"New fee value in basis points. Value of 100 is 1% fee.\"}},\"setFeeCollector(address)\":{\"params\":{\"_feeCollector\":\"New fee collector address.\"}},\"setLOANMetadataUri(address,string)\":{\"params\":{\"loanContract\":\"Address of a loan contract.\",\"metadataUri\":\"New value of LOAN token metadata uri for given `loanContract`.\"}},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"}},\"stateVariables\":{\"_loanMetadataUri\":{\"details\":\"LOAN token minted by a loan contract will return metadata uri stored in this mapping.      If there is no metadata uri for a loan contract, default metadata uri will be used stored under address(0).\"},\"fee\":{\"details\":\"Value of 100 is 1% fee.\"}},\"title\":\"PWN Config\",\"version\":1},\"userdoc\":{\"errors\":{\"InvalidComputerContract(address,address)\":[{\"notice\":\"Thrown when registering a computer which does not support the asset it is registered for.\"}],\"InvalidFeeValue(uint256,uint256)\":[{\"notice\":\"Thrown when trying to set a fee value higher than `MAX_FEE`.\"}],\"ZeroFeeCollector()\":[{\"notice\":\"Thrown when trying to set a fee collector to zero address.\"}],\"ZeroLoanContract()\":[{\"notice\":\"Thrown when trying to set a LOAN token metadata uri for zero address loan contract.\"}]},\"events\":{\"DefaultLOANMetadataUriUpdated(string)\":{\"notice\":\"Emitted when new default LOAN token metadata uri is set.\"},\"FeeCollectorUpdated(address,address)\":{\"notice\":\"Emitted when new fee collector address is set.\"},\"FeeUpdated(uint16,uint16)\":{\"notice\":\"Emitted when new fee value is set.\"},\"LOANMetadataUriUpdated(address,string)\":{\"notice\":\"Emitted when new LOAN token metadata uri is set.\"}},\"kind\":\"user\",\"methods\":{\"fee()\":{\"notice\":\"Protocol fee value in basis points.\"},\"feeCollector()\":{\"notice\":\"Address that collects protocol fees.\"},\"getPoolAdapter(address)\":{\"notice\":\"Returns the pool adapter for a given pool.\"},\"getStateFingerprintComputer(address)\":{\"notice\":\"Returns the state fingerprint computer for a given asset.\"},\"loanMetadataUri(address)\":{\"notice\":\"Return a LOAN token metadata uri base on a loan contract that minted the token.\"},\"registerPoolAdapter(address,address)\":{\"notice\":\"Registers a pool adapter for a given pool.\"},\"registerStateFingerprintComputer(address,address)\":{\"notice\":\"Registers a state fingerprint computer for a given asset.\"},\"setDefaultLOANMetadataUri(string)\":{\"notice\":\"Set a default LOAN token metadata uri.\"},\"setFee(uint16)\":{\"notice\":\"Set new protocol fee value.\"},\"setFeeCollector(address)\":{\"notice\":\"Set new fee collector address.\"},\"setLOANMetadataUri(address,string)\":{\"notice\":\"Set a LOAN token metadata uri for a specific loan contract.\"}},\"notice\":\"Contract holding configurable values of PWN protocol.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/config/PWNConfig.sol\":\"PWNConfig\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":MultiToken/=lib/MultiToken/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts/contracts/\",\":pwn/=src/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32\",\"dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz\"]},\"lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol\":{\"keccak256\":\"0xde231558366826d7cb61725af8147965a61c53b77a352cc8c9af38fc5a92ac3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd55624076bf61d44af5ff351919e32dda748567acfbdd6ba3d6c7be61c758e\",\"dweb:/ipfs/QmSki4dTrf4GPm7MTpG3fk8mC7rnjwd2zMomLp6jLuF63Q\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x3d6069be9b4c01fb81840fb9c2c4dc58dd6a6a4aafaa2c6837de8699574d84c6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://720d6bb56ea0c4ef781c0bd65c5bd0541f5a46100163b2587170f97658d2deed\",\"dweb:/ipfs/QmTS2biLVPrv8CeeXCaKmkFxonMiRvc1LxiYBRYDAJHQUS\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931\",\"dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a367861093b74443b137564d3f3c472f70bcf114739e62059c939f25e315706c\",\"dweb:/ipfs/Qmd7JMpcxD9RuQjK3uM3EzJUgSqdN8vzp8eytEiuwxQJ6h\"]},\"src/config/PWNConfig.sol\":{\"keccak256\":\"0x15a2ab788f84df29b960d50b33803130bdd61fe7c0ce76d4f6bf76da7cccb594\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://b1310535db741a5a7a0aff71f34ef329c7f5bf3117f9c38587e4090bec340fb4\",\"dweb:/ipfs/QmYRWwiSAyZMdxSqMYU1K2YRFzBW7L2dHXktx1BdFW9fP5\"]},\"src/interfaces/IPoolAdapter.sol\":{\"keccak256\":\"0xe0309b4e7da2046095c7dc943d953f32d2a46b0ad64beaf3f4ed1b440fe43f89\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://15870bf95e096b35620787a0eba49f7becbaff738651a83bd28310d022cdc93b\",\"dweb:/ipfs/QmZPYmxrjB6SFWr5arTztrDofQ6XdyzXTUMeaQt5wcbv3T\"]},\"src/interfaces/IStateFingerpringComputer.sol\":{\"keccak256\":\"0xb2f72031bdd6b6ac7179ca9af90c290d37bcc43d6bab4db6e0b1ee7c7b4f72a2\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://d8de3c648f1afab5458e553042a59b0df3d8d54be1a488e891de70821745da0c\",\"dweb:/ipfs/QmQ6QoeMgZGdVjJ2aAt8t1AuBCJ95m6BRSR1GKRqVk4jct\"]}},\"version\":1}",
  "metadata": {
    "compiler": {
      "version": "0.8.16+commit.07a7930e"
    },
    "language": "Solidity",
    "output": {
      "abi": [
        {
          "inputs": [],
          "stateMutability": "nonpayable",
          "type": "constructor"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "computer",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "asset",
              "type": "address"
            }
          ],
          "type": "error",
          "name": "InvalidComputerContract"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "fee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "limit",
              "type": "uint256"
            }
          ],
          "type": "error",
          "name": "InvalidFeeValue"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "ZeroFeeCollector"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "ZeroLoanContract"
        },
        {
          "inputs": [
            {
              "internalType": "string",
              "name": "newUri",
              "type": "string",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "DefaultLOANMetadataUriUpdated",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "oldFeeCollector",
              "type": "address",
              "indexed": false
            },
            {
              "internalType": "address",
              "name": "newFeeCollector",
              "type": "address",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "FeeCollectorUpdated",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "uint16",
              "name": "oldFee",
              "type": "uint16",
              "indexed": false
            },
            {
              "internalType": "uint16",
              "name": "newFee",
              "type": "uint16",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "FeeUpdated",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "uint8",
              "name": "version",
              "type": "uint8",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "Initialized",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "loanContract",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "string",
              "name": "newUri",
              "type": "string",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "LOANMetadataUriUpdated",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "previousOwner",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "newOwner",
              "type": "address",
              "indexed": true
            }
          ],
          "type": "event",
          "name": "OwnershipTransferStarted",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "previousOwner",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "newOwner",
              "type": "address",
              "indexed": true
            }
          ],
          "type": "event",
          "name": "OwnershipTransferred",
          "anonymous": false
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "MAX_FEE",
          "outputs": [
            {
              "internalType": "uint16",
              "name": "",
              "type": "uint16"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "acceptOwnership"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "fee",
          "outputs": [
            {
              "internalType": "uint16",
              "name": "",
              "type": "uint16"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "feeCollector",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "pool",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "getPoolAdapter",
          "outputs": [
            {
              "internalType": "contract IPoolAdapter",
              "name": "",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "asset",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "getStateFingerprintComputer",
          "outputs": [
            {
              "internalType": "contract IStateFingerpringComputer",
              "name": "",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_owner",
              "type": "address"
            },
            {
              "internalType": "uint16",
              "name": "_fee",
              "type": "uint16"
            },
            {
              "internalType": "address",
              "name": "_feeCollector",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "initialize"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "loanContract",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "loanMetadataUri",
          "outputs": [
            {
              "internalType": "string",
              "name": "uri",
              "type": "string"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "owner",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "pendingOwner",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "pool",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "adapter",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "registerPoolAdapter"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "asset",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "computer",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "registerStateFingerprintComputer"
        },
        {
          "inputs": [],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "renounceOwnership"
        },
        {
          "inputs": [
            {
              "internalType": "string",
              "name": "metadataUri",
              "type": "string"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "setDefaultLOANMetadataUri"
        },
        {
          "inputs": [
            {
              "internalType": "uint16",
              "name": "_fee",
              "type": "uint16"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "setFee"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_feeCollector",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "setFeeCollector"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "loanContract",
              "type": "address"
            },
            {
              "internalType": "string",
              "name": "metadataUri",
              "type": "string"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "setLOANMetadataUri"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "newOwner",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "transferOwnership"
        }
      ],
      "devdoc": {
        "kind": "dev",
        "methods": {
          "acceptOwnership()": {
            "details": "The new owner accepts the ownership transfer."
          },
          "getPoolAdapter(address)": {
            "params": {
              "pool": "The pool for which the adapter is requested."
            },
            "returns": {
              "_0": "The adapter for the given pool."
            }
          },
          "getStateFingerprintComputer(address)": {
            "params": {
              "asset": "The asset for which the computer is requested."
            },
            "returns": {
              "_0": "The computer for the given asset."
            }
          },
          "loanMetadataUri(address)": {
            "params": {
              "loanContract": "Address of a loan contract."
            },
            "returns": {
              "uri": "Metadata uri for given loan contract."
            }
          },
          "owner()": {
            "details": "Returns the address of the current owner."
          },
          "pendingOwner()": {
            "details": "Returns the address of the pending owner."
          },
          "registerPoolAdapter(address,address)": {
            "params": {
              "adapter": "The adapter to be registered.",
              "pool": "The pool for which the adapter is registered."
            }
          },
          "registerStateFingerprintComputer(address,address)": {
            "params": {
              "asset": "The asset for which the computer is registered.",
              "computer": "The computer to be registered. Use address(0) to remove a computer."
            }
          },
          "renounceOwnership()": {
            "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."
          },
          "setDefaultLOANMetadataUri(string)": {
            "params": {
              "metadataUri": "New value of default LOAN token metadata uri."
            }
          },
          "setFee(uint16)": {
            "params": {
              "_fee": "New fee value in basis points. Value of 100 is 1% fee."
            }
          },
          "setFeeCollector(address)": {
            "params": {
              "_feeCollector": "New fee collector address."
            }
          },
          "setLOANMetadataUri(address,string)": {
            "params": {
              "loanContract": "Address of a loan contract.",
              "metadataUri": "New value of LOAN token metadata uri for given `loanContract`."
            }
          },
          "transferOwnership(address)": {
            "details": "Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner."
          }
        },
        "version": 1
      },
      "userdoc": {
        "kind": "user",
        "methods": {
          "fee()": {
            "notice": "Protocol fee value in basis points."
          },
          "feeCollector()": {
            "notice": "Address that collects protocol fees."
          },
          "getPoolAdapter(address)": {
            "notice": "Returns the pool adapter for a given pool."
          },
          "getStateFingerprintComputer(address)": {
            "notice": "Returns the state fingerprint computer for a given asset."
          },
          "loanMetadataUri(address)": {
            "notice": "Return a LOAN token metadata uri base on a loan contract that minted the token."
          },
          "registerPoolAdapter(address,address)": {
            "notice": "Registers a pool adapter for a given pool."
          },
          "registerStateFingerprintComputer(address,address)": {
            "notice": "Registers a state fingerprint computer for a given asset."
          },
          "setDefaultLOANMetadataUri(string)": {
            "notice": "Set a default LOAN token metadata uri."
          },
          "setFee(uint16)": {
            "notice": "Set new protocol fee value."
          },
          "setFeeCollector(address)": {
            "notice": "Set new fee collector address."
          },
          "setLOANMetadataUri(address,string)": {
            "notice": "Set a LOAN token metadata uri for a specific loan contract."
          }
        },
        "version": 1
      }
    },
    "settings": {
      "remappings": [
        "MultiToken/=lib/MultiToken/src/",
        "ds-test/=lib/forge-std/lib/ds-test/src/",
        "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
        "forge-std/=lib/forge-std/src/",
        "openzeppelin-contracts/=lib/openzeppelin-contracts/",
        "openzeppelin/=lib/openzeppelin-contracts/contracts/",
        "pwn/=src/"
      ],
      "optimizer": {
        "enabled": true,
        "runs": 200
      },
      "metadata": {
        "bytecodeHash": "ipfs"
      },
      "compilationTarget": {
        "src/config/PWNConfig.sol": "PWNConfig"
      },
      "libraries": {}
    },
    "sources": {
      "lib/openzeppelin-contracts/contracts/access/Ownable.sol": {
        "keccak256": "0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218",
        "urls": [
          "bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32",
          "dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz"
        ],
        "license": "MIT"
      },
      "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol": {
        "keccak256": "0xde231558366826d7cb61725af8147965a61c53b77a352cc8c9af38fc5a92ac3c",
        "urls": [
          "bzz-raw://1fd55624076bf61d44af5ff351919e32dda748567acfbdd6ba3d6c7be61c758e",
          "dweb:/ipfs/QmSki4dTrf4GPm7MTpG3fk8mC7rnjwd2zMomLp6jLuF63Q"
        ],
        "license": "MIT"
      },
      "lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol": {
        "keccak256": "0x3d6069be9b4c01fb81840fb9c2c4dc58dd6a6a4aafaa2c6837de8699574d84c6",
        "urls": [
          "bzz-raw://720d6bb56ea0c4ef781c0bd65c5bd0541f5a46100163b2587170f97658d2deed",
          "dweb:/ipfs/QmTS2biLVPrv8CeeXCaKmkFxonMiRvc1LxiYBRYDAJHQUS"
        ],
        "license": "MIT"
      },
      "lib/openzeppelin-contracts/contracts/utils/Address.sol": {
        "keccak256": "0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa",
        "urls": [
          "bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931",
          "dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm"
        ],
        "license": "MIT"
      },
      "lib/openzeppelin-contracts/contracts/utils/Context.sol": {
        "keccak256": "0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439",
        "urls": [
          "bzz-raw://a367861093b74443b137564d3f3c472f70bcf114739e62059c939f25e315706c",
          "dweb:/ipfs/Qmd7JMpcxD9RuQjK3uM3EzJUgSqdN8vzp8eytEiuwxQJ6h"
        ],
        "license": "MIT"
      },
      "src/config/PWNConfig.sol": {
        "keccak256": "0x15a2ab788f84df29b960d50b33803130bdd61fe7c0ce76d4f6bf76da7cccb594",
        "urls": [
          "bzz-raw://b1310535db741a5a7a0aff71f34ef329c7f5bf3117f9c38587e4090bec340fb4",
          "dweb:/ipfs/QmYRWwiSAyZMdxSqMYU1K2YRFzBW7L2dHXktx1BdFW9fP5"
        ],
        "license": "GPL-3.0-only"
      },
      "src/interfaces/IPoolAdapter.sol": {
        "keccak256": "0xe0309b4e7da2046095c7dc943d953f32d2a46b0ad64beaf3f4ed1b440fe43f89",
        "urls": [
          "bzz-raw://15870bf95e096b35620787a0eba49f7becbaff738651a83bd28310d022cdc93b",
          "dweb:/ipfs/QmZPYmxrjB6SFWr5arTztrDofQ6XdyzXTUMeaQt5wcbv3T"
        ],
        "license": "GPL-3.0-only"
      },
      "src/interfaces/IStateFingerpringComputer.sol": {
        "keccak256": "0xb2f72031bdd6b6ac7179ca9af90c290d37bcc43d6bab4db6e0b1ee7c7b4f72a2",
        "urls": [
          "bzz-raw://d8de3c648f1afab5458e553042a59b0df3d8d54be1a488e891de70821745da0c",
          "dweb:/ipfs/QmQ6QoeMgZGdVjJ2aAt8t1AuBCJ95m6BRSR1GKRqVk4jct"
        ],
        "license": "GPL-3.0-only"
      }
    },
    "version": 1
  },
  "ast": {
    "absolutePath": "src/config/PWNConfig.sol",
    "id": 60391,
    "exportedSymbols": {
      "IPoolAdapter": [
        60696
      ],
      "IStateFingerpringComputer": [
        60718
      ],
      "Initializable": [
        48800
      ],
      "Ownable2Step": [
        46905
      ],
      "PWNConfig": [
        60390
      ]
    },
    "nodeType": "SourceUnit",
    "src": "41:9433:73",
    "nodes": [
      {
        "id": 59986,
        "nodeType": "PragmaDirective",
        "src": "41:23:73",
        "nodes": [],
        "literals": [
          "solidity",
          "0.8",
          ".16"
        ]
      },
      {
        "id": 59988,
        "nodeType": "ImportDirective",
        "src": "66:68:73",
        "nodes": [],
        "absolutePath": "lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol",
        "file": "openzeppelin/access/Ownable2Step.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 60391,
        "sourceUnit": 46906,
        "symbolAliases": [
          {
            "foreign": {
              "id": 59987,
              "name": "Ownable2Step",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 46905,
              "src": "75:12:73",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 59990,
        "nodeType": "ImportDirective",
        "src": "135:75:73",
        "nodes": [],
        "absolutePath": "lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol",
        "file": "openzeppelin/proxy/utils/Initializable.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 60391,
        "sourceUnit": 48801,
        "symbolAliases": [
          {
            "foreign": {
              "id": 59989,
              "name": "Initializable",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 48800,
              "src": "144:13:73",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 59992,
        "nodeType": "ImportDirective",
        "src": "212:63:73",
        "nodes": [],
        "absolutePath": "src/interfaces/IPoolAdapter.sol",
        "file": "pwn/interfaces/IPoolAdapter.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 60391,
        "sourceUnit": 60697,
        "symbolAliases": [
          {
            "foreign": {
              "id": 59991,
              "name": "IPoolAdapter",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 60696,
              "src": "221:12:73",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 59994,
        "nodeType": "ImportDirective",
        "src": "276:89:73",
        "nodes": [],
        "absolutePath": "src/interfaces/IStateFingerpringComputer.sol",
        "file": "pwn/interfaces/IStateFingerpringComputer.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 60391,
        "sourceUnit": 60719,
        "symbolAliases": [
          {
            "foreign": {
              "id": 59993,
              "name": "IStateFingerpringComputer",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 60718,
              "src": "285:25:73",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 60390,
        "nodeType": "ContractDefinition",
        "src": "539:8934:73",
        "nodes": [
          {
            "id": 60002,
            "nodeType": "VariableDeclaration",
            "src": "596:40:73",
            "nodes": [],
            "constant": true,
            "mutability": "constant",
            "name": "VERSION",
            "nameLocation": "621:7:73",
            "scope": 60390,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 60000,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "596:6:73",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "hexValue": "312e32",
              "id": 60001,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "631:5:73",
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_72fde8556a44472a9465c32773a7311620e335fb2293061673df3c1dc72c1df3",
                "typeString": "literal_string \"1.2\""
              },
              "value": "1.2"
            },
            "visibility": "internal"
          },
          {
            "id": 60005,
            "nodeType": "VariableDeclaration",
            "src": "845:37:73",
            "nodes": [],
            "constant": true,
            "functionSelector": "bc063e1a",
            "mutability": "constant",
            "name": "MAX_FEE",
            "nameLocation": "868:7:73",
            "scope": 60390,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint16",
              "typeString": "uint16"
            },
            "typeName": {
              "id": 60003,
              "name": "uint16",
              "nodeType": "ElementaryTypeName",
              "src": "845:6:73",
              "typeDescriptions": {
                "typeIdentifier": "t_uint16",
                "typeString": "uint16"
              }
            },
            "value": {
              "hexValue": "31303030",
              "id": 60004,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "878:4:73",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_1000_by_1",
                "typeString": "int_const 1000"
              },
              "value": "1000"
            },
            "visibility": "public"
          },
          {
            "id": 60008,
            "nodeType": "VariableDeclaration",
            "src": "999:17:73",
            "nodes": [],
            "constant": false,
            "documentation": {
              "id": 60006,
              "nodeType": "StructuredDocumentation",
              "src": "896:98:73",
              "text": " @notice Protocol fee value in basis points.\n @dev Value of 100 is 1% fee."
            },
            "functionSelector": "ddca3f43",
            "mutability": "mutable",
            "name": "fee",
            "nameLocation": "1013:3:73",
            "scope": 60390,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint16",
              "typeString": "uint16"
            },
            "typeName": {
              "id": 60007,
              "name": "uint16",
              "nodeType": "ElementaryTypeName",
              "src": "999:6:73",
              "typeDescriptions": {
                "typeIdentifier": "t_uint16",
                "typeString": "uint16"
              }
            },
            "visibility": "public"
          },
          {
            "id": 60011,
            "nodeType": "VariableDeclaration",
            "src": "1091:27:73",
            "nodes": [],
            "constant": false,
            "documentation": {
              "id": 60009,
              "nodeType": "StructuredDocumentation",
              "src": "1023:63:73",
              "text": " @notice Address that collects protocol fees."
            },
            "functionSelector": "c415b95c",
            "mutability": "mutable",
            "name": "feeCollector",
            "nameLocation": "1106:12:73",
            "scope": 60390,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 60010,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "1091:7:73",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "id": 60016,
            "nodeType": "VariableDeclaration",
            "src": "1437:52:73",
            "nodes": [],
            "constant": false,
            "documentation": {
              "id": 60012,
              "nodeType": "StructuredDocumentation",
              "src": "1125:307:73",
              "text": " @notice Mapping of a loan contract address to LOAN token metadata uri.\n @dev LOAN token minted by a loan contract will return metadata uri stored in this mapping.\n      If there is no metadata uri for a loan contract, default metadata uri will be used stored under address(0)."
            },
            "mutability": "mutable",
            "name": "_loanMetadataUri",
            "nameLocation": "1473:16:73",
            "scope": 60390,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_string_storage_$",
              "typeString": "mapping(address => string)"
            },
            "typeName": {
              "id": 60015,
              "keyType": {
                "id": 60013,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1446:7:73",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "1437:27:73",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_string_storage_$",
                "typeString": "mapping(address => string)"
              },
              "valueType": {
                "id": 60014,
                "name": "string",
                "nodeType": "ElementaryTypeName",
                "src": "1457:6:73",
                "typeDescriptions": {
                  "typeIdentifier": "t_string_storage_ptr",
                  "typeString": "string"
                }
              }
            },
            "visibility": "private"
          },
          {
            "id": 60021,
            "nodeType": "VariableDeclaration",
            "src": "1594:56:73",
            "nodes": [],
            "constant": false,
            "documentation": {
              "id": 60017,
              "nodeType": "StructuredDocumentation",
              "src": "1496:93:73",
              "text": " @notice Mapping holding registered state fingerprint computer to an asset."
            },
            "mutability": "mutable",
            "name": "_sfComputerRegistry",
            "nameLocation": "1631:19:73",
            "scope": 60390,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
              "typeString": "mapping(address => address)"
            },
            "typeName": {
              "id": 60020,
              "keyType": {
                "id": 60018,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1603:7:73",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "1594:28:73",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                "typeString": "mapping(address => address)"
              },
              "valueType": {
                "id": 60019,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1614:7:73",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "visibility": "private"
          },
          {
            "id": 60026,
            "nodeType": "VariableDeclaration",
            "src": "1747:57:73",
            "nodes": [],
            "constant": false,
            "documentation": {
              "id": 60022,
              "nodeType": "StructuredDocumentation",
              "src": "1657:85:73",
              "text": " @notice Mapping holding registered pool adapter to a pool address."
            },
            "mutability": "mutable",
            "name": "_poolAdapterRegistry",
            "nameLocation": "1784:20:73",
            "scope": 60390,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
              "typeString": "mapping(address => address)"
            },
            "typeName": {
              "id": 60025,
              "keyType": {
                "id": 60023,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1756:7:73",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "1747:28:73",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                "typeString": "mapping(address => address)"
              },
              "valueType": {
                "id": 60024,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1767:7:73",
                "stateMutability": "nonpayable",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              }
            },
            "visibility": "private"
          },
          {
            "id": 60033,
            "nodeType": "EventDefinition",
            "src": "2080:47:73",
            "nodes": [],
            "anonymous": false,
            "documentation": {
              "id": 60027,
              "nodeType": "StructuredDocumentation",
              "src": "2014:61:73",
              "text": " @notice Emitted when new fee value is set."
            },
            "eventSelector": "2e7c4279000925b8ff0bca0e7109cbc47fc6f6c4edfb831ffe7466cf0af07fa0",
            "name": "FeeUpdated",
            "nameLocation": "2086:10:73",
            "parameters": {
              "id": 60032,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60029,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "oldFee",
                  "nameLocation": "2104:6:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60033,
                  "src": "2097:13:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint16",
                    "typeString": "uint16"
                  },
                  "typeName": {
                    "id": 60028,
                    "name": "uint16",
                    "nodeType": "ElementaryTypeName",
                    "src": "2097:6:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 60031,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "newFee",
                  "nameLocation": "2119:6:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60033,
                  "src": "2112:13:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint16",
                    "typeString": "uint16"
                  },
                  "typeName": {
                    "id": 60030,
                    "name": "uint16",
                    "nodeType": "ElementaryTypeName",
                    "src": "2112:6:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2096:30:73"
            }
          },
          {
            "id": 60040,
            "nodeType": "EventDefinition",
            "src": "2211:76:73",
            "nodes": [],
            "anonymous": false,
            "documentation": {
              "id": 60034,
              "nodeType": "StructuredDocumentation",
              "src": "2133:73:73",
              "text": " @notice Emitted when new fee collector address is set."
            },
            "eventSelector": "5d16ad41baeb009cd23eb8f6c7cde5c2e0cd5acf4a33926ab488875c37c37f38",
            "name": "FeeCollectorUpdated",
            "nameLocation": "2217:19:73",
            "parameters": {
              "id": 60039,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60036,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "oldFeeCollector",
                  "nameLocation": "2245:15:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60040,
                  "src": "2237:23:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60035,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2237:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 60038,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "newFeeCollector",
                  "nameLocation": "2270:15:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60040,
                  "src": "2262:23:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60037,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2262:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2236:50:73"
            }
          },
          {
            "id": 60047,
            "nodeType": "EventDefinition",
            "src": "2373:74:73",
            "nodes": [],
            "anonymous": false,
            "documentation": {
              "id": 60041,
              "nodeType": "StructuredDocumentation",
              "src": "2293:75:73",
              "text": " @notice Emitted when new LOAN token metadata uri is set."
            },
            "eventSelector": "6004b71123e07b97df793497325c4438343da4eeb06cfe39475aa69d93476527",
            "name": "LOANMetadataUriUpdated",
            "nameLocation": "2379:22:73",
            "parameters": {
              "id": 60046,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60043,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "loanContract",
                  "nameLocation": "2418:12:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60047,
                  "src": "2402:28:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60042,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2402:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 60045,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "newUri",
                  "nameLocation": "2439:6:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60047,
                  "src": "2432:13:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 60044,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2432:6:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2401:45:73"
            }
          },
          {
            "id": 60052,
            "nodeType": "EventDefinition",
            "src": "2541:51:73",
            "nodes": [],
            "anonymous": false,
            "documentation": {
              "id": 60048,
              "nodeType": "StructuredDocumentation",
              "src": "2453:83:73",
              "text": " @notice Emitted when new default LOAN token metadata uri is set."
            },
            "eventSelector": "e358eb330ebc40c9c9375742912f9c5a8ae1db2e9990a15039c889ba971e128b",
            "name": "DefaultLOANMetadataUriUpdated",
            "nameLocation": "2547:29:73",
            "parameters": {
              "id": 60051,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60050,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "newUri",
                  "nameLocation": "2584:6:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60052,
                  "src": "2577:13:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 60049,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2577:6:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2576:15:73"
            }
          },
          {
            "id": 60059,
            "nodeType": "ErrorDefinition",
            "src": "2922:63:73",
            "nodes": [],
            "documentation": {
              "id": 60053,
              "nodeType": "StructuredDocumentation",
              "src": "2801:116:73",
              "text": " @notice Thrown when registering a computer which does not support the asset it is registered for."
            },
            "errorSelector": "e12aeae7",
            "name": "InvalidComputerContract",
            "nameLocation": "2928:23:73",
            "parameters": {
              "id": 60058,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60055,
                  "mutability": "mutable",
                  "name": "computer",
                  "nameLocation": "2960:8:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60059,
                  "src": "2952:16:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60054,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2952:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 60057,
                  "mutability": "mutable",
                  "name": "asset",
                  "nameLocation": "2978:5:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60059,
                  "src": "2970:13:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60056,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2970:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2951:33:73"
            }
          },
          {
            "id": 60066,
            "nodeType": "ErrorDefinition",
            "src": "3083:50:73",
            "nodes": [],
            "documentation": {
              "id": 60060,
              "nodeType": "StructuredDocumentation",
              "src": "2991:87:73",
              "text": " @notice Thrown when trying to set a fee value higher than `MAX_FEE`."
            },
            "errorSelector": "f6696bd5",
            "name": "InvalidFeeValue",
            "nameLocation": "3089:15:73",
            "parameters": {
              "id": 60065,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60062,
                  "mutability": "mutable",
                  "name": "fee",
                  "nameLocation": "3113:3:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60066,
                  "src": "3105:11:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 60061,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3105:7:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 60064,
                  "mutability": "mutable",
                  "name": "limit",
                  "nameLocation": "3126:5:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60066,
                  "src": "3118:13:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 60063,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3118:7:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3104:28:73"
            }
          },
          {
            "id": 60069,
            "nodeType": "ErrorDefinition",
            "src": "3229:25:73",
            "nodes": [],
            "documentation": {
              "id": 60067,
              "nodeType": "StructuredDocumentation",
              "src": "3139:85:73",
              "text": " @notice Thrown when trying to set a fee collector to zero address."
            },
            "errorSelector": "bf67d0ce",
            "name": "ZeroFeeCollector",
            "nameLocation": "3235:16:73",
            "parameters": {
              "id": 60068,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3251:2:73"
            }
          },
          {
            "id": 60072,
            "nodeType": "ErrorDefinition",
            "src": "3375:25:73",
            "nodes": [],
            "documentation": {
              "id": 60070,
              "nodeType": "StructuredDocumentation",
              "src": "3260:110:73",
              "text": " @notice Thrown when trying to set a LOAN token metadata uri for zero address loan contract."
            },
            "errorSelector": "a9fcf0f5",
            "name": "ZeroLoanContract",
            "nameLocation": "3381:16:73",
            "parameters": {
              "id": 60071,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3397:2:73"
            }
          },
          {
            "id": 60088,
            "nodeType": "FunctionDefinition",
            "src": "3609:194:73",
            "nodes": [],
            "body": {
              "id": 60087,
              "nodeType": "Block",
              "src": "3638:165:73",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 60077,
                      "name": "_disableInitializers",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48781,
                      "src": "3734:20:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 60078,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3734:22:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60079,
                  "nodeType": "ExpressionStatement",
                  "src": "3734:22:73"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "hexValue": "30",
                            "id": 60083,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3793:1:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            }
                          ],
                          "id": 60082,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "3785:7:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 60081,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "3785:7:73",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 60084,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "3785:10:73",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 60080,
                      "name": "_transferOwnership",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        46882
                      ],
                      "referencedDeclaration": 46882,
                      "src": "3766:18:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 60085,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3766:30:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60086,
                  "nodeType": "ExpressionStatement",
                  "src": "3766:30:73"
                }
              ]
            },
            "implemented": true,
            "kind": "constructor",
            "modifiers": [
              {
                "arguments": [],
                "id": 60075,
                "kind": "baseConstructorSpecifier",
                "modifierName": {
                  "id": 60074,
                  "name": "Ownable2Step",
                  "nameLocations": [
                    "3623:12:73"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46905,
                  "src": "3623:12:73"
                },
                "nodeType": "ModifierInvocation",
                "src": "3623:14:73"
              }
            ],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "parameters": {
              "id": 60073,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3620:2:73"
            },
            "returnParameters": {
              "id": 60076,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3638:0:73"
            },
            "scope": 60390,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 60132,
            "nodeType": "FunctionDefinition",
            "src": "3809:345:73",
            "nodes": [],
            "body": {
              "id": 60131,
              "nodeType": "Block",
              "src": "3902:252:73",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 60105,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 60100,
                          "name": "_owner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 60090,
                          "src": "3920:6:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "30",
                              "id": 60103,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3938:1:73",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 60102,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3930:7:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 60101,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "3930:7:73",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 60104,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3930:10:73",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "3920:20:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "4f776e6572206973207a65726f2061646472657373",
                        "id": 60106,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3942:23:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_b71fe4437d4fc7217a6dc3d93a19fbf7545fbcba9e2ee114009cac704924811c",
                          "typeString": "literal_string \"Owner is zero address\""
                        },
                        "value": "Owner is zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_b71fe4437d4fc7217a6dc3d93a19fbf7545fbcba9e2ee114009cac704924811c",
                          "typeString": "literal_string \"Owner is zero address\""
                        }
                      ],
                      "id": 60099,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "3912:7:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 60107,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3912:54:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60108,
                  "nodeType": "ExpressionStatement",
                  "src": "3912:54:73"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 60110,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60090,
                        "src": "3995:6:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 60109,
                      "name": "_transferOwnership",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        46882
                      ],
                      "referencedDeclaration": 46882,
                      "src": "3976:18:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 60111,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "3976:26:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60112,
                  "nodeType": "ExpressionStatement",
                  "src": "3976:26:73"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 60119,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 60114,
                          "name": "_feeCollector",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 60094,
                          "src": "4021:13:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "arguments": [
                            {
                              "hexValue": "30",
                              "id": 60117,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4046:1:73",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 60116,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "4038:7:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 60115,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "4038:7:73",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 60118,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4038:10:73",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "4021:27:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "46656520636f6c6c6563746f72206973207a65726f2061646472657373",
                        "id": 60120,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4050:31:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f3bc465cc59597962dd7684d37300709f7169b334c10611ab519f0556721cbbc",
                          "typeString": "literal_string \"Fee collector is zero address\""
                        },
                        "value": "Fee collector is zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f3bc465cc59597962dd7684d37300709f7169b334c10611ab519f0556721cbbc",
                          "typeString": "literal_string \"Fee collector is zero address\""
                        }
                      ],
                      "id": 60113,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4013:7:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 60121,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4013:69:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60122,
                  "nodeType": "ExpressionStatement",
                  "src": "4013:69:73"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 60124,
                        "name": "_feeCollector",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60094,
                        "src": "4109:13:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 60123,
                      "name": "_setFeeCollector",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60217,
                      "src": "4092:16:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 60125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4092:31:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60126,
                  "nodeType": "ExpressionStatement",
                  "src": "4092:31:73"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 60128,
                        "name": "_fee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60092,
                        "src": "4142:4:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      ],
                      "id": 60127,
                      "name": "_setFee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60174,
                      "src": "4134:7:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint16_$returns$__$",
                        "typeString": "function (uint16)"
                      }
                    },
                    "id": 60129,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4134:13:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60130,
                  "nodeType": "ExpressionStatement",
                  "src": "4134:13:73"
                }
              ]
            },
            "functionSelector": "708c0db9",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 60097,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 60096,
                  "name": "initializer",
                  "nameLocations": [
                    "3890:11:73"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 48702,
                  "src": "3890:11:73"
                },
                "nodeType": "ModifierInvocation",
                "src": "3890:11:73"
              }
            ],
            "name": "initialize",
            "nameLocation": "3818:10:73",
            "parameters": {
              "id": 60095,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60090,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "3837:6:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60132,
                  "src": "3829:14:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60089,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3829:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 60092,
                  "mutability": "mutable",
                  "name": "_fee",
                  "nameLocation": "3852:4:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60132,
                  "src": "3845:11:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint16",
                    "typeString": "uint16"
                  },
                  "typeName": {
                    "id": 60091,
                    "name": "uint16",
                    "nodeType": "ElementaryTypeName",
                    "src": "3845:6:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 60094,
                  "mutability": "mutable",
                  "name": "_feeCollector",
                  "nameLocation": "3866:13:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60132,
                  "src": "3858:21:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60093,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3858:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3828:52:73"
            },
            "returnParameters": {
              "id": 60098,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3902:0:73"
            },
            "scope": 60390,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 60145,
            "nodeType": "FunctionDefinition",
            "src": "4496:78:73",
            "nodes": [],
            "body": {
              "id": 60144,
              "nodeType": "Block",
              "src": "4544:30:73",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 60141,
                        "name": "_fee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60135,
                        "src": "4562:4:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      ],
                      "id": 60140,
                      "name": "_setFee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60174,
                      "src": "4554:7:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint16_$returns$__$",
                        "typeString": "function (uint16)"
                      }
                    },
                    "id": 60142,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4554:13:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60143,
                  "nodeType": "ExpressionStatement",
                  "src": "4554:13:73"
                }
              ]
            },
            "documentation": {
              "id": 60133,
              "nodeType": "StructuredDocumentation",
              "src": "4363:128:73",
              "text": " @notice Set new protocol fee value.\n @param _fee New fee value in basis points. Value of 100 is 1% fee."
            },
            "functionSelector": "8e005553",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 60138,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 60137,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "4534:9:73"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46741,
                  "src": "4534:9:73"
                },
                "nodeType": "ModifierInvocation",
                "src": "4534:9:73"
              }
            ],
            "name": "setFee",
            "nameLocation": "4505:6:73",
            "parameters": {
              "id": 60136,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60135,
                  "mutability": "mutable",
                  "name": "_fee",
                  "nameLocation": "4519:4:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60145,
                  "src": "4512:11:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint16",
                    "typeString": "uint16"
                  },
                  "typeName": {
                    "id": 60134,
                    "name": "uint16",
                    "nodeType": "ElementaryTypeName",
                    "src": "4512:6:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4511:13:73"
            },
            "returnParameters": {
              "id": 60139,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4544:0:73"
            },
            "scope": 60390,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 60174,
            "nodeType": "FunctionDefinition",
            "src": "4744:229:73",
            "nodes": [],
            "body": {
              "id": 60173,
              "nodeType": "Block",
              "src": "4782:191:73",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    },
                    "id": 60153,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 60151,
                      "name": "_fee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60148,
                      "src": "4796:4:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint16",
                        "typeString": "uint16"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "id": 60152,
                      "name": "MAX_FEE",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60005,
                      "src": "4803:7:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint16",
                        "typeString": "uint16"
                      }
                    },
                    "src": "4796:14:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 60159,
                  "nodeType": "IfStatement",
                  "src": "4792:85:73",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [
                        {
                          "id": 60155,
                          "name": "_fee",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 60148,
                          "src": "4854:4:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint16",
                            "typeString": "uint16"
                          }
                        },
                        {
                          "id": 60156,
                          "name": "MAX_FEE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 60005,
                          "src": "4867:7:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint16",
                            "typeString": "uint16"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint16",
                            "typeString": "uint16"
                          },
                          {
                            "typeIdentifier": "t_uint16",
                            "typeString": "uint16"
                          }
                        ],
                        "id": 60154,
                        "name": "InvalidFeeValue",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60066,
                        "src": "4831:15:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$",
                          "typeString": "function (uint256,uint256) pure"
                        }
                      },
                      "id": 60157,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [
                        "4849:3:73",
                        "4860:5:73"
                      ],
                      "names": [
                        "fee",
                        "limit"
                      ],
                      "nodeType": "FunctionCall",
                      "src": "4831:46:73",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 60158,
                    "nodeType": "RevertStatement",
                    "src": "4824:53:73"
                  }
                },
                {
                  "assignments": [
                    60161
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 60161,
                      "mutability": "mutable",
                      "name": "oldFee",
                      "nameLocation": "4895:6:73",
                      "nodeType": "VariableDeclaration",
                      "scope": 60173,
                      "src": "4888:13:73",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint16",
                        "typeString": "uint16"
                      },
                      "typeName": {
                        "id": 60160,
                        "name": "uint16",
                        "nodeType": "ElementaryTypeName",
                        "src": "4888:6:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 60163,
                  "initialValue": {
                    "id": 60162,
                    "name": "fee",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 60008,
                    "src": "4904:3:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4888:19:73"
                },
                {
                  "expression": {
                    "id": 60166,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 60164,
                      "name": "fee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60008,
                      "src": "4917:3:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint16",
                        "typeString": "uint16"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 60165,
                      "name": "_fee",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60148,
                      "src": "4923:4:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint16",
                        "typeString": "uint16"
                      }
                    },
                    "src": "4917:10:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    }
                  },
                  "id": 60167,
                  "nodeType": "ExpressionStatement",
                  "src": "4917:10:73"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 60169,
                        "name": "oldFee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60161,
                        "src": "4953:6:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      },
                      {
                        "id": 60170,
                        "name": "_fee",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60148,
                        "src": "4961:4:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        },
                        {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      ],
                      "id": 60168,
                      "name": "FeeUpdated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60033,
                      "src": "4942:10:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_uint16_$_t_uint16_$returns$__$",
                        "typeString": "function (uint16,uint16)"
                      }
                    },
                    "id": 60171,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4942:24:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60172,
                  "nodeType": "EmitStatement",
                  "src": "4937:29:73"
                }
              ]
            },
            "documentation": {
              "id": 60146,
              "nodeType": "StructuredDocumentation",
              "src": "4580:159:73",
              "text": " @notice Internal implementation of setting new protocol fee value.\n @param _fee New fee value in basis points. Value of 100 is 1% fee."
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setFee",
            "nameLocation": "4753:7:73",
            "parameters": {
              "id": 60149,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60148,
                  "mutability": "mutable",
                  "name": "_fee",
                  "nameLocation": "4768:4:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60174,
                  "src": "4761:11:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint16",
                    "typeString": "uint16"
                  },
                  "typeName": {
                    "id": 60147,
                    "name": "uint16",
                    "nodeType": "ElementaryTypeName",
                    "src": "4761:6:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4760:13:73"
            },
            "returnParameters": {
              "id": 60150,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4782:0:73"
            },
            "scope": 60390,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 60187,
            "nodeType": "FunctionDefinition",
            "src": "5096:115:73",
            "nodes": [],
            "body": {
              "id": 60186,
              "nodeType": "Block",
              "src": "5163:48:73",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 60183,
                        "name": "_feeCollector",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60177,
                        "src": "5190:13:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 60182,
                      "name": "_setFeeCollector",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60217,
                      "src": "5173:16:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 60184,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5173:31:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60185,
                  "nodeType": "ExpressionStatement",
                  "src": "5173:31:73"
                }
              ]
            },
            "documentation": {
              "id": 60175,
              "nodeType": "StructuredDocumentation",
              "src": "4979:112:73",
              "text": " @notice Set new fee collector address.\n @param _feeCollector New fee collector address."
            },
            "functionSelector": "a42dce80",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 60180,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 60179,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "5153:9:73"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46741,
                  "src": "5153:9:73"
                },
                "nodeType": "ModifierInvocation",
                "src": "5153:9:73"
              }
            ],
            "name": "setFeeCollector",
            "nameLocation": "5105:15:73",
            "parameters": {
              "id": 60178,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60177,
                  "mutability": "mutable",
                  "name": "_feeCollector",
                  "nameLocation": "5129:13:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60187,
                  "src": "5121:21:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60176,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5121:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5120:23:73"
            },
            "returnParameters": {
              "id": 60181,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5163:0:73"
            },
            "scope": 60390,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 60217,
            "nodeType": "FunctionDefinition",
            "src": "5365:297:73",
            "nodes": [],
            "body": {
              "id": 60216,
              "nodeType": "Block",
              "src": "5422:240:73",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 60198,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 60193,
                      "name": "_feeCollector",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60190,
                      "src": "5436:13:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 60196,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "5461:1:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 60195,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "5453:7:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 60194,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5453:7:73",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 60197,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5453:10:73",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "5436:27:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 60202,
                  "nodeType": "IfStatement",
                  "src": "5432:70:73",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 60199,
                        "name": "ZeroFeeCollector",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60069,
                        "src": "5484:16:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
                          "typeString": "function () pure"
                        }
                      },
                      "id": 60200,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "5484:18:73",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 60201,
                    "nodeType": "RevertStatement",
                    "src": "5477:25:73"
                  }
                },
                {
                  "assignments": [
                    60204
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 60204,
                      "mutability": "mutable",
                      "name": "oldFeeCollector",
                      "nameLocation": "5521:15:73",
                      "nodeType": "VariableDeclaration",
                      "scope": 60216,
                      "src": "5513:23:73",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 60203,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "5513:7:73",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 60206,
                  "initialValue": {
                    "id": 60205,
                    "name": "feeCollector",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 60011,
                    "src": "5539:12:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5513:38:73"
                },
                {
                  "expression": {
                    "id": 60209,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 60207,
                      "name": "feeCollector",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60011,
                      "src": "5561:12:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 60208,
                      "name": "_feeCollector",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60190,
                      "src": "5576:13:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "5561:28:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 60210,
                  "nodeType": "ExpressionStatement",
                  "src": "5561:28:73"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 60212,
                        "name": "oldFeeCollector",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60204,
                        "src": "5624:15:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 60213,
                        "name": "_feeCollector",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60190,
                        "src": "5641:13:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 60211,
                      "name": "FeeCollectorUpdated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60040,
                      "src": "5604:19:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 60214,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5604:51:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60215,
                  "nodeType": "EmitStatement",
                  "src": "5599:56:73"
                }
              ]
            },
            "documentation": {
              "id": 60188,
              "nodeType": "StructuredDocumentation",
              "src": "5217:143:73",
              "text": " @notice Internal implementation of setting new fee collector address.\n @param _feeCollector New fee collector address."
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_setFeeCollector",
            "nameLocation": "5374:16:73",
            "parameters": {
              "id": 60191,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60190,
                  "mutability": "mutable",
                  "name": "_feeCollector",
                  "nameLocation": "5399:13:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60217,
                  "src": "5391:21:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60189,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5391:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5390:23:73"
            },
            "returnParameters": {
              "id": 60192,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5422:0:73"
            },
            "scope": 60390,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 60249,
            "nodeType": "FunctionDefinition",
            "src": "6106:423:73",
            "nodes": [],
            "body": {
              "id": 60248,
              "nodeType": "Block",
              "src": "6202:327:73",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 60232,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 60227,
                      "name": "loanContract",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60220,
                      "src": "6216:12:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 60230,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "6240:1:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 60229,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "6232:7:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 60228,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6232:7:73",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 60231,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6232:10:73",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "6216:26:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 60236,
                  "nodeType": "IfStatement",
                  "src": "6212:191:73",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 60233,
                        "name": "ZeroLoanContract",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60072,
                        "src": "6385:16:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
                          "typeString": "function () pure"
                        }
                      },
                      "id": 60234,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6385:18:73",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 60235,
                    "nodeType": "RevertStatement",
                    "src": "6378:25:73"
                  }
                },
                {
                  "expression": {
                    "id": 60241,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 60237,
                        "name": "_loanMetadataUri",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60016,
                        "src": "6414:16:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_string_storage_$",
                          "typeString": "mapping(address => string storage ref)"
                        }
                      },
                      "id": 60239,
                      "indexExpression": {
                        "id": 60238,
                        "name": "loanContract",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60220,
                        "src": "6431:12:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "6414:30:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage",
                        "typeString": "string storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 60240,
                      "name": "metadataUri",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60222,
                      "src": "6447:11:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "src": "6414:44:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "id": 60242,
                  "nodeType": "ExpressionStatement",
                  "src": "6414:44:73"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 60244,
                        "name": "loanContract",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60220,
                        "src": "6496:12:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 60245,
                        "name": "metadataUri",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60222,
                        "src": "6510:11:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 60243,
                      "name": "LOANMetadataUriUpdated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60047,
                      "src": "6473:22:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (address,string memory)"
                      }
                    },
                    "id": 60246,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6473:49:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60247,
                  "nodeType": "EmitStatement",
                  "src": "6468:54:73"
                }
              ]
            },
            "documentation": {
              "id": 60218,
              "nodeType": "StructuredDocumentation",
              "src": "5871:230:73",
              "text": " @notice Set a LOAN token metadata uri for a specific loan contract.\n @param loanContract Address of a loan contract.\n @param metadataUri New value of LOAN token metadata uri for given `loanContract`."
            },
            "functionSelector": "4bbcf8de",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 60225,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 60224,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "6192:9:73"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46741,
                  "src": "6192:9:73"
                },
                "nodeType": "ModifierInvocation",
                "src": "6192:9:73"
              }
            ],
            "name": "setLOANMetadataUri",
            "nameLocation": "6115:18:73",
            "parameters": {
              "id": 60223,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60220,
                  "mutability": "mutable",
                  "name": "loanContract",
                  "nameLocation": "6142:12:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60249,
                  "src": "6134:20:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60219,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6134:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 60222,
                  "mutability": "mutable",
                  "name": "metadataUri",
                  "nameLocation": "6170:11:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60249,
                  "src": "6156:25:73",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 60221,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "6156:6:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6133:49:73"
            },
            "returnParameters": {
              "id": 60226,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6202:0:73"
            },
            "scope": 60390,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 60271,
            "nodeType": "FunctionDefinition",
            "src": "6677:197:73",
            "nodes": [],
            "body": {
              "id": 60270,
              "nodeType": "Block",
              "src": "6758:116:73",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 60264,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 60257,
                        "name": "_loanMetadataUri",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60016,
                        "src": "6768:16:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_string_storage_$",
                          "typeString": "mapping(address => string storage ref)"
                        }
                      },
                      "id": 60262,
                      "indexExpression": {
                        "arguments": [
                          {
                            "hexValue": "30",
                            "id": 60260,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "6793:1:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            }
                          ],
                          "id": 60259,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "6785:7:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 60258,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "6785:7:73",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 60261,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "6785:10:73",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "6768:28:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage",
                        "typeString": "string storage ref"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 60263,
                      "name": "metadataUri",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60252,
                      "src": "6799:11:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "src": "6768:42:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage",
                      "typeString": "string storage ref"
                    }
                  },
                  "id": 60265,
                  "nodeType": "ExpressionStatement",
                  "src": "6768:42:73"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 60267,
                        "name": "metadataUri",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60252,
                        "src": "6855:11:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 60266,
                      "name": "DefaultLOANMetadataUriUpdated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60052,
                      "src": "6825:29:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory)"
                      }
                    },
                    "id": 60268,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6825:42:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 60269,
                  "nodeType": "EmitStatement",
                  "src": "6820:47:73"
                }
              ]
            },
            "documentation": {
              "id": 60250,
              "nodeType": "StructuredDocumentation",
              "src": "6535:137:73",
              "text": " @notice Set a default LOAN token metadata uri.\n @param metadataUri New value of default LOAN token metadata uri."
            },
            "functionSelector": "c4743ae0",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 60255,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 60254,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "6748:9:73"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46741,
                  "src": "6748:9:73"
                },
                "nodeType": "ModifierInvocation",
                "src": "6748:9:73"
              }
            ],
            "name": "setDefaultLOANMetadataUri",
            "nameLocation": "6686:25:73",
            "parameters": {
              "id": 60253,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60252,
                  "mutability": "mutable",
                  "name": "metadataUri",
                  "nameLocation": "6726:11:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60271,
                  "src": "6712:25:73",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 60251,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "6712:6:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6711:27:73"
            },
            "returnParameters": {
              "id": 60256,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6758:0:73"
            },
            "scope": 60390,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 60303,
            "nodeType": "FunctionDefinition",
            "src": "7103:312:73",
            "nodes": [],
            "body": {
              "id": 60302,
              "nodeType": "Block",
              "src": "7192:223:73",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 60283,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 60279,
                      "name": "uri",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60277,
                      "src": "7202:3:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "baseExpression": {
                        "id": 60280,
                        "name": "_loanMetadataUri",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60016,
                        "src": "7208:16:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_string_storage_$",
                          "typeString": "mapping(address => string storage ref)"
                        }
                      },
                      "id": 60282,
                      "indexExpression": {
                        "id": 60281,
                        "name": "loanContract",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60274,
                        "src": "7225:12:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "7208:30:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage",
                        "typeString": "string storage ref"
                      }
                    },
                    "src": "7202:36:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  "id": 60284,
                  "nodeType": "ExpressionStatement",
                  "src": "7202:36:73"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 60291,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "arguments": [
                          {
                            "id": 60287,
                            "name": "uri",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 60277,
                            "src": "7344:3:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          ],
                          "id": 60286,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "7338:5:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                            "typeString": "type(bytes storage pointer)"
                          },
                          "typeName": {
                            "id": 60285,
                            "name": "bytes",
                            "nodeType": "ElementaryTypeName",
                            "src": "7338:5:73",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 60288,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "7338:10:73",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      "id": 60289,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "7349:6:73",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "7338:17:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 60290,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "7359:1:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "7338:22:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 60301,
                  "nodeType": "IfStatement",
                  "src": "7334:74:73",
                  "trueBody": {
                    "expression": {
                      "id": 60299,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftHandSide": {
                        "id": 60292,
                        "name": "uri",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60277,
                        "src": "7374:3:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      "nodeType": "Assignment",
                      "operator": "=",
                      "rightHandSide": {
                        "baseExpression": {
                          "id": 60293,
                          "name": "_loanMetadataUri",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 60016,
                          "src": "7380:16:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_string_storage_$",
                            "typeString": "mapping(address => string storage ref)"
                          }
                        },
                        "id": 60298,
                        "indexExpression": {
                          "arguments": [
                            {
                              "hexValue": "30",
                              "id": 60296,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7405:1:73",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 60295,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "7397:7:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 60294,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "7397:7:73",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 60297,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7397:10:73",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "7380:28:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage",
                          "typeString": "string storage ref"
                        }
                      },
                      "src": "7374:34:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_memory_ptr",
                        "typeString": "string memory"
                      }
                    },
                    "id": 60300,
                    "nodeType": "ExpressionStatement",
                    "src": "7374:34:73"
                  }
                }
              ]
            },
            "documentation": {
              "id": 60272,
              "nodeType": "StructuredDocumentation",
              "src": "6880:218:73",
              "text": " @notice Return a LOAN token metadata uri base on a loan contract that minted the token.\n @param loanContract Address of a loan contract.\n @return uri Metadata uri for given loan contract."
            },
            "functionSelector": "23355750",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "loanMetadataUri",
            "nameLocation": "7112:15:73",
            "parameters": {
              "id": 60275,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60274,
                  "mutability": "mutable",
                  "name": "loanContract",
                  "nameLocation": "7136:12:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60303,
                  "src": "7128:20:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60273,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7128:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7127:22:73"
            },
            "returnParameters": {
              "id": 60278,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60277,
                  "mutability": "mutable",
                  "name": "uri",
                  "nameLocation": "7187:3:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60303,
                  "src": "7173:17:73",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 60276,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "7173:6:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7172:19:73"
            },
            "scope": 60390,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 60319,
            "nodeType": "FunctionDefinition",
            "src": "7829:179:73",
            "nodes": [],
            "body": {
              "id": 60318,
              "nodeType": "Block",
              "src": "7931:77:73",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "baseExpression": {
                          "id": 60313,
                          "name": "_sfComputerRegistry",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 60021,
                          "src": "7974:19:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                            "typeString": "mapping(address => address)"
                          }
                        },
                        "id": 60315,
                        "indexExpression": {
                          "id": 60314,
                          "name": "asset",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 60306,
                          "src": "7994:5:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "7974:26:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 60312,
                      "name": "IStateFingerpringComputer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60718,
                      "src": "7948:25:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_IStateFingerpringComputer_$60718_$",
                        "typeString": "type(contract IStateFingerpringComputer)"
                      }
                    },
                    "id": 60316,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7948:53:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IStateFingerpringComputer_$60718",
                      "typeString": "contract IStateFingerpringComputer"
                    }
                  },
                  "functionReturnParameters": 60311,
                  "id": 60317,
                  "nodeType": "Return",
                  "src": "7941:60:73"
                }
              ]
            },
            "documentation": {
              "id": 60304,
              "nodeType": "StructuredDocumentation",
              "src": "7624:200:73",
              "text": " @notice Returns the state fingerprint computer for a given asset.\n @param asset The asset for which the computer is requested.\n @return The computer for the given asset."
            },
            "functionSelector": "2df927ac",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getStateFingerprintComputer",
            "nameLocation": "7838:27:73",
            "parameters": {
              "id": 60307,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60306,
                  "mutability": "mutable",
                  "name": "asset",
                  "nameLocation": "7874:5:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60319,
                  "src": "7866:13:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60305,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7866:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7865:15:73"
            },
            "returnParameters": {
              "id": 60311,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60310,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 60319,
                  "src": "7904:25:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IStateFingerpringComputer_$60718",
                    "typeString": "contract IStateFingerpringComputer"
                  },
                  "typeName": {
                    "id": 60309,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 60308,
                      "name": "IStateFingerpringComputer",
                      "nameLocations": [
                        "7904:25:73"
                      ],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 60718,
                      "src": "7904:25:73"
                    },
                    "referencedDeclaration": 60718,
                    "src": "7904:25:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IStateFingerpringComputer_$60718",
                      "typeString": "contract IStateFingerpringComputer"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7903:27:73"
            },
            "scope": 60390,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 60356,
            "nodeType": "FunctionDefinition",
            "src": "8262:346:73",
            "nodes": [],
            "body": {
              "id": 60355,
              "nodeType": "Block",
              "src": "8356:252:73",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 60334,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 60329,
                      "name": "computer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60324,
                      "src": "8370:8:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 60332,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "8390:1:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 60331,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "8382:7:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 60330,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8382:7:73",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 60333,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "8382:10:73",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "8370:22:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 60348,
                  "nodeType": "IfStatement",
                  "src": "8366:187:73",
                  "trueBody": {
                    "condition": {
                      "id": 60341,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "!",
                      "prefix": true,
                      "src": "8410:57:73",
                      "subExpression": {
                        "arguments": [
                          {
                            "id": 60339,
                            "name": "asset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 60322,
                            "src": "8461:5:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "expression": {
                            "arguments": [
                              {
                                "id": 60336,
                                "name": "computer",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 60324,
                                "src": "8437:8:73",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 60335,
                              "name": "IStateFingerpringComputer",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 60718,
                              "src": "8411:25:73",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_IStateFingerpringComputer_$60718_$",
                                "typeString": "type(contract IStateFingerpringComputer)"
                              }
                            },
                            "id": 60337,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8411:35:73",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IStateFingerpringComputer_$60718",
                              "typeString": "contract IStateFingerpringComputer"
                            }
                          },
                          "id": 60338,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "8447:13:73",
                          "memberName": "supportsToken",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 60717,
                          "src": "8411:49:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view external returns (bool)"
                          }
                        },
                        "id": 60340,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8411:56:73",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "id": 60347,
                    "nodeType": "IfStatement",
                    "src": "8406:147:73",
                    "trueBody": {
                      "errorCall": {
                        "arguments": [
                          {
                            "id": 60343,
                            "name": "computer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 60324,
                            "src": "8528:8:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "id": 60344,
                            "name": "asset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 60322,
                            "src": "8545:5:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 60342,
                          "name": "InvalidComputerContract",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 60059,
                          "src": "8492:23:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$__$",
                            "typeString": "function (address,address) pure"
                          }
                        },
                        "id": 60345,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [
                          "8518:8:73",
                          "8538:5:73"
                        ],
                        "names": [
                          "computer",
                          "asset"
                        ],
                        "nodeType": "FunctionCall",
                        "src": "8492:61:73",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_tuple$__$",
                          "typeString": "tuple()"
                        }
                      },
                      "id": 60346,
                      "nodeType": "RevertStatement",
                      "src": "8485:68:73"
                    }
                  }
                },
                {
                  "expression": {
                    "id": 60353,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 60349,
                        "name": "_sfComputerRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60021,
                        "src": "8564:19:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                          "typeString": "mapping(address => address)"
                        }
                      },
                      "id": 60351,
                      "indexExpression": {
                        "id": 60350,
                        "name": "asset",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60322,
                        "src": "8584:5:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "8564:26:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 60352,
                      "name": "computer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60324,
                      "src": "8593:8:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "8564:37:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 60354,
                  "nodeType": "ExpressionStatement",
                  "src": "8564:37:73"
                }
              ]
            },
            "documentation": {
              "id": 60320,
              "nodeType": "StructuredDocumentation",
              "src": "8014:243:73",
              "text": " @notice Registers a state fingerprint computer for a given asset.\n @param asset The asset for which the computer is registered.\n @param computer The computer to be registered. Use address(0) to remove a computer."
            },
            "functionSelector": "935bf0d7",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 60327,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 60326,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "8346:9:73"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46741,
                  "src": "8346:9:73"
                },
                "nodeType": "ModifierInvocation",
                "src": "8346:9:73"
              }
            ],
            "name": "registerStateFingerprintComputer",
            "nameLocation": "8271:32:73",
            "parameters": {
              "id": 60325,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60322,
                  "mutability": "mutable",
                  "name": "asset",
                  "nameLocation": "8312:5:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60356,
                  "src": "8304:13:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60321,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8304:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 60324,
                  "mutability": "mutable",
                  "name": "computer",
                  "nameLocation": "8327:8:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60356,
                  "src": "8319:16:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60323,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8319:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8303:33:73"
            },
            "returnParameters": {
              "id": 60328,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8356:0:73"
            },
            "scope": 60390,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 60372,
            "nodeType": "FunctionDefinition",
            "src": "9002:139:73",
            "nodes": [],
            "body": {
              "id": 60371,
              "nodeType": "Block",
              "src": "9077:64:73",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "baseExpression": {
                          "id": 60366,
                          "name": "_poolAdapterRegistry",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 60026,
                          "src": "9107:20:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                            "typeString": "mapping(address => address)"
                          }
                        },
                        "id": 60368,
                        "indexExpression": {
                          "id": 60367,
                          "name": "pool",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 60359,
                          "src": "9128:4:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "9107:26:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 60365,
                      "name": "IPoolAdapter",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60696,
                      "src": "9094:12:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_contract$_IPoolAdapter_$60696_$",
                        "typeString": "type(contract IPoolAdapter)"
                      }
                    },
                    "id": 60369,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9094:40:73",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IPoolAdapter_$60696",
                      "typeString": "contract IPoolAdapter"
                    }
                  },
                  "functionReturnParameters": 60364,
                  "id": 60370,
                  "nodeType": "Return",
                  "src": "9087:47:73"
                }
              ]
            },
            "documentation": {
              "id": 60357,
              "nodeType": "StructuredDocumentation",
              "src": "8817:180:73",
              "text": " @notice Returns the pool adapter for a given pool.\n @param pool The pool for which the adapter is requested.\n @return The adapter for the given pool."
            },
            "functionSelector": "b2091231",
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getPoolAdapter",
            "nameLocation": "9011:14:73",
            "parameters": {
              "id": 60360,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60359,
                  "mutability": "mutable",
                  "name": "pool",
                  "nameLocation": "9034:4:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60372,
                  "src": "9026:12:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60358,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9026:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9025:14:73"
            },
            "returnParameters": {
              "id": 60364,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60363,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 60372,
                  "src": "9063:12:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IPoolAdapter_$60696",
                    "typeString": "contract IPoolAdapter"
                  },
                  "typeName": {
                    "id": 60362,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 60361,
                      "name": "IPoolAdapter",
                      "nameLocations": [
                        "9063:12:73"
                      ],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 60696,
                      "src": "9063:12:73"
                    },
                    "referencedDeclaration": 60696,
                    "src": "9063:12:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IPoolAdapter_$60696",
                      "typeString": "contract IPoolAdapter"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9062:14:73"
            },
            "scope": 60390,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 60389,
            "nodeType": "FunctionDefinition",
            "src": "9338:132:73",
            "nodes": [],
            "body": {
              "id": 60388,
              "nodeType": "Block",
              "src": "9417:53:73",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 60386,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "id": 60382,
                        "name": "_poolAdapterRegistry",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60026,
                        "src": "9427:20:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                          "typeString": "mapping(address => address)"
                        }
                      },
                      "id": 60384,
                      "indexExpression": {
                        "id": 60383,
                        "name": "pool",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 60375,
                        "src": "9448:4:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "9427:26:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 60385,
                      "name": "adapter",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 60377,
                      "src": "9456:7:73",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "9427:36:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 60387,
                  "nodeType": "ExpressionStatement",
                  "src": "9427:36:73"
                }
              ]
            },
            "documentation": {
              "id": 60373,
              "nodeType": "StructuredDocumentation",
              "src": "9147:186:73",
              "text": " @notice Registers a pool adapter for a given pool.\n @param pool The pool for which the adapter is registered.\n @param adapter The adapter to be registered."
            },
            "functionSelector": "cbf35d88",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 60380,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 60379,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "9407:9:73"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46741,
                  "src": "9407:9:73"
                },
                "nodeType": "ModifierInvocation",
                "src": "9407:9:73"
              }
            ],
            "name": "registerPoolAdapter",
            "nameLocation": "9347:19:73",
            "parameters": {
              "id": 60378,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 60375,
                  "mutability": "mutable",
                  "name": "pool",
                  "nameLocation": "9375:4:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60389,
                  "src": "9367:12:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60374,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9367:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 60377,
                  "mutability": "mutable",
                  "name": "adapter",
                  "nameLocation": "9389:7:73",
                  "nodeType": "VariableDeclaration",
                  "scope": 60389,
                  "src": "9381:15:73",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 60376,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9381:7:73",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9366:31:73"
            },
            "returnParameters": {
              "id": 60381,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "9417:0:73"
            },
            "scope": 60390,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 59996,
              "name": "Ownable2Step",
              "nameLocations": [
                "561:12:73"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 46905,
              "src": "561:12:73"
            },
            "id": 59997,
            "nodeType": "InheritanceSpecifier",
            "src": "561:12:73"
          },
          {
            "baseName": {
              "id": 59998,
              "name": "Initializable",
              "nameLocations": [
                "575:13:73"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 48800,
              "src": "575:13:73"
            },
            "id": 59999,
            "nodeType": "InheritanceSpecifier",
            "src": "575:13:73"
          }
        ],
        "canonicalName": "PWNConfig",
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 59995,
          "nodeType": "StructuredDocumentation",
          "src": "368:170:73",
          "text": " @title PWN Config\n @notice Contract holding configurable values of PWN protocol.\n @dev Is intendet to be used as a proxy via `TransparentUpgradeableProxy`."
        },
        "fullyImplemented": true,
        "linearizedBaseContracts": [
          60390,
          48800,
          46905,
          46822,
          52751
        ],
        "name": "PWNConfig",
        "nameLocation": "548:9:73",
        "scope": 60391,
        "usedErrors": [
          60059,
          60066,
          60069,
          60072
        ]
      }
    ],
    "license": "GPL-3.0-only"
  },
  "id": 73
}